2011-02-03 3 views
3

독점 형식의 데이터를 일련의 구조로로드하는 Matlab API를 사용하고 있습니다.Matlab의 다른 구조체 구조체 크기 (R2010a 64 비트 Linux)

>> fieldName에 (데이터 (1))

의 ANS =

'Grid_Point_ID' 
'Grid_Point_Latitude' 
'Grid_Point_Longitude' 
'Grid_Point_Altitude' 
'Grid_Point_Mask' 
'BT_Data' 

>> 데이터 (1) .BT_Data : 여기 셋 파일을 로딩 후의 모습의 예

ANS =

BT_Data: [1x66 struct] 

>> fieldName에 (데이터 (1) .BT_Data (1))

의 ANS =

'Flags' 
'BT_Value_Real' 
'BT_Value_Imag' 
'Pixel_Radiometric_Accuracy' 
'Incidence_Angle' 
'Azimuth_Angle' 
'Faraday_Rotation_Angle' 
'Geometric_Rotation_Angle' 
'Snapshot_ID_of_Pixel' 
'Footprint_Axis1' 
'Footprint_Axis2' 

나는 모든 data(i).BT_Data(j)를 반복 할 싶어요. 나는 이미 data 미세의 길이를 가지고,하지만 난 (각 data(i)에 따라 다릅니다) BT_Data의 크기/길이 얻을 수 없습니다

>> 길이 (데이터 (1) .BT_Data)

ANS =

1 

>> 사이즈 (데이터 (1) .BT_Data)

의 ANS =

012,303,578,874,883,868,

여기 내 예상 결과는 ans = 66 (또는 size()에 해당하는 배열)입니다.

구조상의 데이터 형식에 익숙하지 않은데, 이것이 내 고투의 일부일 수 있습니다. 그러나 length(data)은 정상적으로 작동하므로 BT_Data에서 작동하지 않는 이유는 혼란 스럽습니다 (BT_Data(:)도 시도했습니다).

내가 찾을 수있는 가장 관련있는 이전 답변은 1757250이지만 작동하지 못했습니다 (여기서는 적용되지 않습니다). 제공 할 수있는 통찰력에 감사드립니다.

------ 편집 ------

여기에 내가 심지어 내가에있어 지점에 도착하기 위해 API를 사용해야하는 방법에 좀 더 통찰력이다 :

>> 시스템 ('에선 -sf은 /opt/rwapi-matlab/lib/rwapi/smos/config/xml_rw_api.usr_conf.xml. ');
setenv ('XML_RW_API_HOME', '/ opt/rwapi-matlab/lib/rwapi');
경로 (경로, '/ opt/rwapi-matlab');

>> 자극 RWAPI.product = ('SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1')

배열 SMOS matlab에 인터페이스 버전 1.4
(C) 캐나다 (http://www.array.ca)
배포 또는이 소프트웨어의 수정 2010 어레이 시스템 컴퓨팅 주식은

자극 배열로부터 서면 허가 필요 =

RWAPI.product handle 
Package: RWAPI 

Properties: 
    filename: 'SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1' 
     header: [1x1 struct] 
xml_datablock: [] 

방법, 이벤트 수퍼 클래스

>> data = prod.dataset (2)

data =

RWAPI.dataset 핸들이없는 속성입니다. 포장 RWAPI

방법 이벤트 수퍼 클래스

>> 데이터 (1)

의 ANS =

 Grid_Point_ID: 251721 
Grid_Point_Latitude: 25.5000 
Grid_Point_Longitude: -102.2590 
Grid_Point_Altitude: 1.4714e+03 
    Grid_Point_Mask: 2 
      BT_Data: [1x66 struct] 

>> 데이터 (1) .BT_Data

ANS =

BT_Data: [1x66 struct] 
,363,210

>> 데이터 (1) .BT_Data (1)

ANS =

     Flags: 6229 
      BT_Value_Real: 262.5275 
      BT_Value_Imag: 0 
Pixel_Radiometric_Accuracy: 6160 
      Incidence_Angle: 31966 
      Azimuth_Angle: 10299 
    Faraday_Rotation_Angle: 65277 
    Geometric_Rotation_Angle: 58605 
     Snapshot_ID_of_Pixel: 65752530 
      Footprint_Axis1: 19649 
      Footprint_Axis2: 14625 

>> whos는
이름 크기 바이트 클래스

ANS의 1 × 1 논리
데이터 1x19091 112 RWAPI 특성 . 데이터 세트
자극 1x2 112 RWAPI.product

답변

2

그래, 나는 정말로 RWAPI 클래스의 오버 라이트 된 subsref 메소드가 이상하다고 생각한다. 약간 병적 인 하위 참조가있는 클래스를 정의하여 관찰 된 모든 동작을 재현 할 수있었습니다.

classdef stupidref 
    %STUPIDREF Reproduce odd indexing behavior that jpatton saw. Buggy. 
    properties 
     BT_Data = repmat(struct('foo',42, 'bar',42), [1 66]); 
    end 
    methods 
     function B = subsref(A,S) 
      s = S(1); 
      subs = s.subs; 
      chain = S(2:end); 

      switch s.type 
       case '()' 
        B = builtin('subsref', A, s); 
        if ~isempty(chain) 
         B = subsref(B, chain); 
        end 

       case '.' 
        % Non-standard behavior! 
        if ~isempty(chain) && isequal(chain(1).type, '()') 
         B = subsref(A.(s.subs), chain); 
        else 
         B = struct(s.subs, A.(s.subs)); 
        end 
      end 
     end 
    end 
end 

data(1).BT_Datafieldnames(data(1).BT_Data(1)), 반복 ".BT_Data을"추가 탭 완성 사이의 이상한 차이와 일치한다.

>> data = stupidref; 
>> data(1).BT_Data 
ans = 
    BT_Data: [1x66 struct] 
>> fieldnames(data(1).BT_Data) 
ans = 
    'BT_Data' 
>> fieldnames(data(1).BT_Data(1)) 
ans = 
    'foo' 
    'bar' 
>> length(data(1).BT_Data) 
ans = 
    1 
>> data(1).BT_Data.BT_Data.BT_Data.BT_Data.BT_Data.BT_Data % produced by tab-completion 
ans = 
    BT_Data: [1x66 struct] 
>> 

귀하의 해결 방법이 좋다 - 당신이 a = data(1).BT_Data를 호출하면, 당신은 정상 구조체를 가지고, 및 비표준 subsref은 비켜입니다. 하나의 라이너에서 동일한 효과를 얻을 수 있습니다 getfield.

>> btdata = getfield(data(1).BT_Data, 'BT_Data') 
btdata = 
1x66 struct array with fields: 
    foo 
    bar 

RWAPI 라이브러리 작성자에게 가능한 버그로보고합니다.

이 코드를 직접 수정 해보십시오. 그것은 진단을 지원하는 것만 큼 대단히 답이 아닙니다.

+1

+1 : 니스! 담배 총을 찾은 것 같네요. RWAPI 라이브러리 작성자가이 스레드에 와서 클래스가하는 것을 재현하는 "stupidref"라는 클래스를 본다면 벽에 파리가되고 싶습니다! = D – gnovice

+0

와우, 멋진 작품! 그것은 정말 내 머리 위로 지금 (전 배열/행렬 이외의 것들에 대해 Matlab을 사용한 적이 한번도 없었습니다.)하지만 이것은 structs/objs를 더 이해하려고 시도하면서 훌륭한 참고 자료가 될 것입니다. +1 실제로 (나는 그것을 지금 할 수있다!). – jpatton

+0

감사합니다! 행운과 함께 @ Jpatton은 Matlab 경력에서 이런 종류의 일을 거의 처리하지 않아야합니다. –

1

결과 중 일부는 모순 된 것처럼 보입니다. 현장 BT_Data가 1로-66 구조 배열 포함 된 경우 우선, 나는 다음과 같은 출력을 볼 것으로 예상 것 :

>> data(1).BT_Data 

ans = 

1x66 struct array with fields: 
    Flags 
    ... %# etc. 

이 볼 수 있다는 사실 :

>> data(1).BT_Data 

ans = 

BT_Data: [1x66 struct] 

나에게 제안을 BT_Data은 실제로는 BT_Data이라는 필드와 이라는 필드가있는 1x1 구조입니다. 필드는 1x66 구조체 배열을 포함합니다. 이것은 첫 번째 BT_Data (1x1 구조)의 길이와 크기를 볼 때 사용자가 보는 것을 설명합니다. 이 경우, 다음과 같은 결과를 얻을해야합니다 : 당신이 할 때

>> size(data(1).BT_Data.BT_Data) 

ans = 

    1  66 

그러나이 여전히 표시되는 출력을 설명하지 않습니다 : 저를 던지고

fieldnames(data(1).BT_Data(1)) 

합니다.

isstruct(data(1).BT_Data) 

을 그리고 이것은 BT_Data는 구조입니다 1 경우 반환해야합니다 : 당신은 BT_Data 실제로이 작업을 수행하여 다른 색인 생성 및 표시 동작을 할 수있는 구조와 목적이 아닌 다른 유형의 것을 확인 할 수 있습니다.

+0

'isstruct'는 1을 반환합니다.'data (1) .BT_Data.'를 타이핑하고 탭 완성을 사용하면 다른 'BT_Data'를 사용하고'.BT_Data'를 계속 추가합니다. 오랫동안 계속 지키고있어. 그러나 여전히 크기에 대해서만 [1 1]을 반환하고 경고 : 예기치 않은 필드를 던질 것입니다. – jpatton

+2

이것은 거의 손상된 구조체처럼 들립니다. 이 독점 API는 MEX 파일을 사용하여 Matlab의 내부 데이터 구조를 처리합니까? –

+1

데이터를로드 한 후'whos'의 결과는 무엇입니까? 그리고'builtin ('isstruct', data (1) .BT_Data)'에 대해서요? (단지 사용자 정의 클래스가 isstruct()를 오버라이드하여 structs로 가장하기 위해 builtin()이이를 무시합니다. –

2

나는 몹시 만족하지 비록, 해결 방법을 발견했습니다

>> A = 데이터 (1) .BT_Data

A =

BT_Data: [1x66 struct] 

>> 길이 (a.BT_Data)

ANS의

= 0

다른 적절한 "방법"이 없기 때문에 지금 답변으로 표시하겠습니다.

앤드류 (Andrew)의 답변으로 문제가 해결되었습니다 (이 해결 방법이 필요한 이유).

+2

RWAPI의 하위 참조 방법에 이상한 점이 있다면 의미가 있습니다. 'data (1) .BT_Data (3)'과 같은 일련의 참조를 할 때, 모든 단계 ("(1)", ".BT_Data"및 "(3)")는 데이터의 subsref , 그리고 그것은 그들이 원하는 방식으로 그들을 처리하거나 잘못 취급 할 수 있습니다. 중간 변수에서 더 짧은 참조의 결과를 캡처함으로써 구조체를 가져오고 일반 인덱싱 및 length() 함수를 호출 할 수 있습니다. –