TIPS
セルアレイ応用例
セルアレイは、データ形式を問わず保存できる。この特徴をうまく使うと従来実現が面倒であった処理が容易になる。ここでは、その例としてデータの格納例を挙げその有効性を示す。
セルアレイを使わないデータ保存テクニック
例えば、パラメータを変化させシミュレーション結果などを保存したい場合などを考える。
maxdata=[ ]; for i=0:0.01:1 [y,t]=step(tf(1,[1 i 1])); [yy,ind]=max(y); plot(t,y,t(ind),y(ind),'rx'); drawnow; maxdata=[maxdata;t(ind) y(ind)]; end |
このシミュレーションは、伝達関数の減衰係数を変化させ、そのステップ応答を計算、その中からオーバーシュート量をその時間をmaxdata変数に保存している例である。
maxdata変数には、時間t(ind)とその出力値y(ind)があり、シミュレーションが全て終了したときに、結果が保存される。この保存法は、まず、maxdataが空にする必要がある。maxdata=[ ];
次に、maxdata=[maxdata;t(ind) y(ind)];と言った具合に書いてあげる。この様に記述するmaxdata配列の最後の列にこの命令を実行するごとにデータを追加してくれる。この方法では、メモリが続く限りいくらでも保存可能である。(ただし、メモリを動的に確保するため、余り長い時間続けていると処理速度が徐々に遅くなる可能性があるが。)
maxdata =
15.7500 1.9991
3.1200 1.9842
3.2008 1.9674
3.2008 1.9523
3.2008 1.9375
3.2008 1.9229
3.2008 1.9085
3.2032 1.8942
....
この保存テクニックは、MATLABの行列として保存するため、例えば、同時にyのデータ全てを保存したいなどの場合には、簡単に拡張することができない。
それを可能にすることが出来るのがセル配列である。
セル配列は、通常の配列とは異なり、大カッコ([ ])の代わりに中カッコ({ })を用いる。
具体的には、
maxdata={ }; j=1; for i=0:0.01:1 [y,t]=step(tf(1,[1 i 1])); [yy,ind]=max(y); plot(t,y,t(ind),y(ind),'rx'); drawnow; maxdata{j}={t(ind), y(ind),t,y}; j = j + 1; end |
とする。この場合、jがセル配列maxdataの大きさを示す。
セル配列では、
maxdata
とタイプしても以下のように出てしまい中を見ることができない。
maxdata =
Columns 1 through 5
{1x3 cell} {1x3 cell} {1x3 cell} {1x3 cell} {1x3 cell}
Columns 6 through 10
....
そこで中を見るためには、
》 maxdata{1}
ans =
[15.7500] [1.9991] [107x1 double]
となる、ここで1番目のデータを見るには、セル配列から行列形式のデータに変更するためにcell2matを使用する。
》 cell2mat(maxdata{1}(1))
ans =
15.7500
とすればよい。もし、2番目のデータを見るには、
》 cell2mat(maxdata{1}(2))
ans =
1.9991
3番目のベクトルを見るには、
》 cell2mat(maxdata{1}(3))
ans =
0
0.0695
....
とすればよい。
また、出来たセル配列maxdataから、シミュレーション結果をまとめて見るには以下のようなスクリプトを記述すればできる。
close all for j=1:length(maxdata) tind=cell2mat(maxdata{j}(1)); yind=cell2mat(maxdata{j}(2)); t=cell2mat(maxdata{j}(3)); y=cell2mat(maxdata{j}(4)); plot(t,y,tind,yind,'rx'); drawnow; end |
maxdataを保存し、このドキュメントを動かせは、先ほどシミュレーションしたのと同様に結果のみを表示することができる。