どちらかというとセル配列ライクである.matlab: セル配列の参照法とその周辺を参照.
試してみよう.まず,構造体配列を作る.
>> a=struct('f',{'foo','bar'})次に,小括弧で普通に参照してみる.
a =
1x2 struct array with fields:
f
>> a(1)構造体が一つ返ってくる.さらに,インデクスリストで参照してみる.
ans =
f: 'foo'
>> a(:)構造体配列が返される.コロン単独 : で参照すると一次元ベクトル(縦に並んだ配列)が返されるのは,
ans =
2x1 struct array with fields:
f
Matlab のお約束の振る舞いである.ちなみに,1:end で参照すると,振る舞いが異なる.この話はいずれ.
問題はここから.構造体配列のフィールドを参照する場合の話だ.
単一要素の参照なら,
>> a(1).fであって全く普通だ.しかし!インデクスで参照してフィールドを指定すると,
ans =
foo
>> a(:).fとなり,また単にフィールドを指定した場合にも
ans =
foo
ans =
bar
>> a.f
ans =
foo
ans =
bar
のように,セル配列の記事でも述べた,例の「複数の文を評価した状態」になる.
あとの話はセル配列のときと同様になるわけだが,構造体配列でありがちな例を挙げておこう.
例:一件のレコードが一つの構造体になっているような構造体配列で,特定のものを見つける.
>> clear a b cてな感じ.連結 {} や [] を使って単純に書ける.
>> a.label='small';a.value=100;b.label='small';b.value=200;c.label='large';c.value=1000;d=[a,b,c]
d =
1x3 struct array with fields:
label
value
>> small_ones = find(strcmp({d.label},'small'))
small_ones =
1 2
>> under150 = small_ones(find([d(small_ones).value]<150))
under150 =
1
関数 deal を使うともっと幅が広がるかもしれない.例えば,上で定義した構造体配列 d に対して
>> [d.label]=deal('tiny','little','huge');d.labelなんてこともできる.
ans =
tiny
ans =
little
ans =
huge
0 件のコメント:
コメントを投稿