2011-02-03 28 views
3

私は独自のフォーマットから一連の構造体にデータを読み込むMatlab APIを使用しています。ここでは、データセットがファイルをロードした後にどのように見えるかの例です:Matlab内の別の構造体内の構造体のサイズ(R2010a 64ビットLinux)

>>フィールド名(データ(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] 

>>フィールド名(データ(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 =

1  1 

私の予想通りの結果は、ans = 66(または同等の配列size())です。

私の苦労の一部であるかもしれない構造データフォーマットにはあまり慣れていません。しかしlength(data)は正常に動作したので、なぜそれがBT_Data(私もBT_Data(:)を試してみました)で動作しないのは混乱しています。

私が見つけた最も関連性の高い以前の回答は1757250ですが、私はそれを動作させることができませんでした(私はそれがここに当てはまらないと思います)。あなたが提供できるどんな洞察にも感謝します。

------ EDIT ------

はここで私も私がでてるポイントを取得するためにAPIを使用する必要がどのようにもう少し洞察力です:

>>システム( 'LN -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');

>> PROD = RWAPI.product( 'SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1')

アレイSMOS Matlabのインターフェースバージョン1。このソフトウェアのカナダの4
(C)2010アレイシステムコンピューティング株式会社(http://www.array.ca
配布や変更は、Array

のprod =

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] 

名サイズバイトクラス

属性

>>データ(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 

>>玉葉ANS 1x1の1論理
データ1x19091 112 RWAPI 。データセット
プロダクト1x2 112 RWAPI.product

答えて

2

さて、私は本当に、それらのRWAPIクラスのオーバーライドされたsubsrefメソッドでは奇妙だと思っています。私は、少し病理学的な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で1ライナーで同じ効果を得ることができます。

>> 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

ありがとう! @ジャパン、幸運にも、あなたは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は実際には1つのフィールドがBT_Dataと呼ばれ、フィールドに1行66列の構造配列が含まれている1行1列の構造体です。これは、最初のBT_Data(1行1列の構造)の長さとサイズを取得したときに表示される内容を説明します。このような場合は、次のような結果が得られます。

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

私を投げています:

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

ans = 

    1  66 

しかし、これはまだあなたが行うときに表示出力を説明していません。

isstruct(data(1).BT_Data) 

そして BT_Dataが構造体である場合、これは 1を返す必要があります:あなたは BT_Dataは実際の構造ではなく、これを行うことにより、異なるインデックスと表示動作を有することができるオブジェクトの他のタイプであることを確認することをお勧めします。

+0

'isstruct'は1を返します。私は' data(1).BT_Data.'をタイプしてタブ補完を使用すると、別の 'BT_Data'に固執し、' .BT_Data'限り、私はタブを維持します。しかし、それでも大きさは '[1 1]'を返すだけで、 'Warning:unexpected fields'を投げるでしょう。 – jpatton

+2

これは壊れた構造体のように思えます。この独自のAPIはMEXファイルを使用してMatlabの内部データ構造を処理しますか? –

+1

データをロードした後の 'whos'の出力は何ですか?そして 'builtin( 'isstruct'、data(1).BT_Data)'についてはどうでしょうか? (ちょっとの場合、ユーザ定義のクラスは構造体としてマスカレードするためにisstruct()をオーバーライドすることができ、組み込み関数は組み込み関数をバイパスします) –

2

私はそれがひどく満足ではありませんが、回避策を見つけた:

>> A =データ(1).BT_Data

=

BT_Data: [1x66 struct] 

>>長さを( a.BT_Data)

ANS =

66 
0を

私はこれを他の「適切な」方法で行うことは疑いがあるので、これを答えとしてマークします。

アンドリューの答えは本当に問題を解決しました(なぜこの回避策が機能するのか)。

+2

これは、RWAPIのsubsrefメソッドが奇妙な場合に意味があります。 'data(1).BT_Data(3)'のような一連の参照を行うと、すべてのステップ - "(1)"、 ".BT_Data"、 "(3) - がデータのsubsref()メソッドに渡されますそれを自由に処理したり、誤って処理することができます。より短い参照の結果を中間変数に取り込むことで、構造体を取得し、通常のインデックス作成およびlength()関数を呼び出すことができます。 –

関連する問題