構造体配列のフィールドから行列を作る
MATLAB便利です。
便利なのですが、たまにかゆいところに手が届かないときがあります。
構造体配列(struct
)と行列(matrix
)とセル行列(cell
)周りの行き来がしにくいのです。
少々強引ですが、パキッとstruct→matrixにする方法があるので紹介します。
s = struct() ; num_struct = 10 ; for i=1:num_struct s(i).field1 = i / 10 ; s(i).field2 = i^2 / 100 ; s(i).field3 = exp(i) / exp(10) ; end s.field1 % array of 'ans' %{ ans = 0.10000 ans = 0.20000 ans = 0.30000 ans = 0.40000 ans = 0.50000 ans = 0.60000 ans = 0.70000 ans = 0.80000 ans = 0.90000 ans = 1 %} {s.field1} % array in cell(1,1) %{ ans = { [1,1] = 0.10000 [1,2] = 0.20000 [1,3] = 0.30000 [1,4] = 0.40000 [1,5] = 0.50000 [1,6] = 0.60000 [1,7] = 0.70000 [1,8] = 0.80000 [1,9] = 0.90000 [1,10] = 1 } %} cell2mat({s.field1}) % array %{ ans = 0.10000 0.20000 0.30000 0.40000 0.50000 0.60000 0.70000 0.80000 0.90000 1.00000 %} figure(1) ; clf ; plot( cat(2, cell2mat({s.field1})', cell2mat({s.field2})', cell2mat({s.field3})') ) ; legend('field1', 'field2', 'field3') ; xlim([0 12]) ;
plot結果
plot結果が見慣れないのは、Octave
で実行したためです。MATLABでもちゃんと動作します。
コツは、構造体配列のフィールドを得ようとすると複数のansが生成されるのですが、
これを1つのcellにまとめてしまい({}で囲む)、cell2matで行列に変換している点です。
若干無理やり感がありますが、綺麗に書ける場合が多いので覚えておいて損はないと思います。
※2014/02/02追記
[s.field1]
で同じことが出来ました・・・知らなかった・・・