2007年3月28日水曜日

matlab: 構造体配列の参照法とその周辺

構造体配列も,普通の配列(数値配列や文字配列)とは少し違う.
どちらかというとセル配列ライクである.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 件のコメント:

コメントを投稿