【MATLAB】セル配列にまとめてデータを格納する

配列にデータを入れていく場合、大体のプログラム言語ではこんな感じで記載するかと思います。

for(i = 1; i < 5; i++)
{
    array(i) = xxx
}

しかしMATLABではループ処理を使うことなく複数のデータを配列に入れることができます。

まとめてデータを格納することでスクリプトの行数短縮に加え、処理速度の大幅な向上も見込めます。

ここで紹介することは覚えておいて損は無いかと思います。

スポンサーリンク

はじめに

これ以降の説明で使用するセル配列として5行5列のセル配列”sampleCell”を準備しておきます。

複数のインデックスに同じ値を入れる

4列目の要素を全て1にします。

sampleCell(:, 4 = {1});

3行目の要素を全て文字列”abc”に変更します。

sampleCell(3, :) = {'abc'};

別のセル配列の値を入れる

2行目の値を別のセル配列に格納されている値にします。例として{3, 4, 5, ‘ab’, ‘cd’}という値が入っているセル配列inputCellの値をsampleCellの2行目に代入します。

inputCell = {3, 4, 5, 'ab', 'cd'};
sampleCell(2, :) = inputCell;

2行目にinputCellの値が代入されました。

この際の注意点として、代入する側とされる側のサイズが一致していないといけません。

例えば代入する側のinputCellがサイズが1×4だった場合、代入される側のsampleCellの2行目サイズ1×5と不一致となるため代入することができずにエラーとなります。

配列の値を入れる

セル配列にセル配列ではなく通常の配列の値を入れたい場合はひと工夫必要です。

通常の配列の中身をセル配列に格納しようとして同じようにスクリプトを書くとエラーになります。

この場合は代入したい配列をnum2cell関数でセル配列に変換してやります。

sampleCell(4, :) = num2cell(inputArray);

変則的な代入方法

セル配列への値の代入は代入する側、される側のサイズさえ合っていれば少し変則的?な方法でも代入することができます。

連続でないインデックスに格納

sampleCellの2行目の1,3,5列目にinputCellの2,3,5番目の要素を代入します。

sampleCell(2, [1 3 5]) = inputCell([2 3 5]);

sampleCellの2行1列にinputCellの2番目の要素”4″が、2行3列にinputCellの3番目の要素1行目に3番目の要素”5″が、2行5列にinputCellの5番目の要素’cd’が格納されました。

boolean型の配列を使用

セル配列から値を取り出す際、インデックスの指定に同じサイズのboolean型配列を使用することができましたが、値を代入する際も同じことが行えます。

先ほどと同じくsampleCellの2行目の1,3,5列目にinputCellの2,3,5番目の要素を代入します。

sampleCell(2, [true false true false true]) = inputCell([false true true false true]);

これだけ見るとこんなの使い道あるの?と思われるかもしれませんが、この方法は非常に使えます。

例えば1列目の数値が奇数なら2列目に文字列”奇数”、偶数なら文字列”偶数”を格納することを考えます。

まず1列目が奇数か偶数かを判定します。

ret = mod(cell2mat(sampleCell(1, :)), 2) == 1;

1列目の各数値を2で割った余りが1かどうかにより奇数偶数を判定し、奇数だったらtrue、偶数だったらfalseとなります。

cell2mat関数はセル配列を通常の配列に変換する関数です。

数値との比較は通常の配列としか行えないのでセル配列から通常の配列に変換する必要があります。

この配列boolean配列を使用して

sampleCell(2 : ret) = {'奇数'};

とすれば、1列目が奇数の行の2列目に文字列”奇数”が入ります。

またboolean配列retをチルダ(~)を使用して反転すると奇数がfalse、偶数がtrueとなるので

sampleCell(2 : ~ret) = {'偶数'};

とすれば、1列目が偶数の行の2列目に文字列”偶数”が入ります。

このようにtrue/falseが返ってくる演算や関数と組み合わせて使用することで色々な場面で役立ちます。

コメント

タイトルとURLをコピーしました