開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

構造体配列のフィールドから行列を作る

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

f:id:hihokaruta:20140128032130p:plain

 plot結果が見慣れないのは、Octaveで実行したためです。MATLABでもちゃんと動作します。

 コツは、構造体配列のフィールドを得ようとすると複数のansが生成されるのですが、
 これを1つのcellにまとめてしまい({}で囲む)、cell2matで行列に変換している点です。

 若干無理やり感がありますが、綺麗に書ける場合が多いので覚えておいて損はないと思います。

 ※2014/02/02追記
 [s.field1]で同じことが出来ました・・・知らなかった・・・