ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コンマ区切りリスト

コンマ区切りリストとは

連続する数字をコンマで区切って入力すると、"コンマ区切りリスト" を作成できます。MATLAB® では、各値が次に示すように別々に返されます。

1,2,3
ans =

     1


ans =

     2


ans =

     3

このようなリストは、これ自体ではあまり役に立つものではありません。しかし、コンマ区切りリストを MATLAB 構造体やセル配列などの大規模で複雑なデータ構造で使用すると、MATLAB コードを簡易化することができます。

コンマ区切りリストの生成

この節では、セル配列または MATLAB 構造体からコンマ区切りリストを生成する方法を述べます。

セル配列からのリストの生成

セル配列から複数の要素を抽出して、コンマ区切りリストを生成できます。次に示すように、4 行 6 列のセル配列があるとします。

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
C
C = 

    [2]    [10]    [18]    [26]    [34]    [42]
    [4]    [12]    [20]    [28]    [36]    [44]
    [6]    [14]    [22]    [30]    [38]    [46]
    [8]    [16]    [24]    [32]    [40]    [48]

第 5 列を抽出して、コンマ区切りリストを生成します。

C{:,5}
ans =

    34


ans =

    36


ans =

    38


ans =

    40

これは、次のように明示的に入力するのと同じです。

C{1,5},C{2,5},C{3,5},C{4,5}

構造体からのリストの生成

構造体の場合は、次元の 1 つにある構造体のフィールドを抽出して、コンマ区切りリストを生成できます。

まず、上で使用したセル配列を、f1 から f6 の 6 個のフィールドをもつ 4 行 1 列の MATLAB 構造体に変換します。すべての行のフィールド f5 を読み取ると、MATLAB からコンマ区切りリストが返されます。

S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
S.f5
ans =

    34


ans =

    36


ans =

    38


ans =

    40

これは、次のように明示的に入力するのと同じです。

S(1).f5,S(2).f5,S(3).f5,S(4).f5

コンマ区切りリストからの出力の代入

コンマ区切りリストに含まれる連続した要素の一部またはすべてを、単純な代入ステートメントを使用して変数に代入できます。前の節からのセル配列 C を使用して、最初の行を変数 c1 から c6 に代入します。

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
[c1,c2,c3,c4,c5,c6] = C{1,1:6};
c5
c5 =

    34
式によって返される出力数よりも少ない数の出力変数を指定すると、MATLAB では最初の N 個の出力が最初の N 個の変数に代入され、残りの出力は無視されます。次の例では、C{1,1:3} が変数 c1c2c3 に代入され、C{1,4:6} が削除されます。
[c1,c2,c3] = C{1,1:6};
同じ方法で構造体の出力を代入することもできます。
S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
[sf1,sf2,sf3] = S.f5;
sf3
sf3 =

    38
また、関数 deal を使用して同様の処理を実行することもできます。

コンマ区切りリストへの代入

コンマ区切りリストに複数の値を代入する最も簡単な方法は、関数 deal を使用することです。この関数では、入力引数すべてがコンマ区切りリストの要素に分配されます。

この例では、deal を使用してコンマ区切りリストの各要素を上書きします。まず、リストを作成します。

c{1} = [31 07]; 
c{2} = [03 78];
c{:}
ans =

    31     7


ans =

     3    78

deal を使用して、リスト内の各要素を上書きします。

[c{:}] = deal([10 20],[14 12]);
c{:}
ans =

    10    20


ans =

    14    12

この例では、上記の例と同じ処理が実行されますが、構造体フィールド内のベクトルのコンマ区切りリストを使用しています。

s(1).field1 = [31 07];
s(2).field1 = [03 78];
s.field1
ans =

    31     7


ans =

     3    78

deal を使用して、構造体のフィールドを上書きします。

[s.field1] = deal([10 20],[14 12]);
s.field1
ans =

    10    20


ans =

    14    12

コンマ区切りリストの使用方法

コンマ区切りリストの一般的な使用方法は、次のとおりです。

次の節では、セル配列をもつコンマ区切りリストの使用方法の例を示します。これらの例は MATLAB 構造体でも使用できます。

配列の作成

行列や配列を作成するときに、コンマ区切りリストを使用して、一連の要素を入力することができます。セル自体を追加する場合に比較して、要素の "リスト" を挿入する場合にはどのようなことが起こるかに注意してください。

C{:, 5} を使用して要素のリストを指定すると、MATLAB では次のように 4 つの独立した要素が挿入されます。

A = {'Hello',C{:,5},magic(4)}
A = 

    'Hello'    [34]    [36]    [38]    [40]    [4x4 double]

C セル自体を指定すると、MATLAB では次のようにセル配列全体が挿入されます。

A = {'Hello',C,magic(4)}
A = 

    'Hello'    {4x6 cell}    [4x4 double]

配列の表示

リストを使用して、次のように構造体やセル配列の全部または一部を表示することができます。

A{:}
ans =

Hello


ans = 

    [2]    [10]    [18]    [26]    [34]    [42]
    [4]    [12]    [20]    [28]    [36]    [44]
    [6]    [14]    [22]    [30]    [38]    [46]
    [8]    [16]    [24]    [32]    [40]    [48]


ans =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

連結

次のように、コンマ区切りリストを角かっこ内に配置すると、リストから指定した要素が抽出され、連結されます。

A = [C{:,5:6}]
A =

    34    36    38    40    42    44    46    48

関数呼び出しの引数

関数呼び出しのコードを作成する際には、各引数をコンマで区切ったリストとして、入力引数を入力します。構造体やセル配列にこれらの引数が保存されている場合は、代わりに構造体やセル配列から引数リストの全部または一部を作成することができます。この方法は、引数の変数番号を渡す場合に特に役立ちます。

次の例では、関数 plot に複数の属性値の引数を渡します。

X = -pi:pi/10:pi;
Y = tan(sin(X)) - sin(tan(X));
C = cell(2,3);
C{1,1} = 'LineWidth';
C{2,1} = 2;
C{1,2} = 'MarkerEdgeColor';
C{2,2} = 'k';
C{1,3} = 'MarkerFaceColor';
C{2,3} = 'g';
figure
plot(X,Y,'--rs',C{:})

関数の戻り値

MATLAB 関数では、複数の値を呼び出し側に返すこともできます。これらの値は、各値をコンマで区切ったリストで返されます。各戻り値をリストで表示する代わりに、構造体やセル配列でコンマ区切りリストを使用することができます。この方法は、戻り値の変数番号を使用する関数で非常に便利です。

次の例では、セル配列に 3 つの値が返されます。

C = cell(1,3);
[C{:}] = fileparts('work/mytests/strArrays.mat')
C = 

    'work/mytests'    'strArrays'    '.mat'

高速フーリエ変換の例

関数 fftshift では、配列の各次元の左半分と右半分が入れ替えられます。[0 2 4 6 8 10] などのような簡単なベクトルの場合は、出力は [6 8 10 0 2 4] になります。多次元配列の場合、関数 fftshift では各次元で入れ替えが行われます。

関数 fftshift では、インデックスのベクトルを使用して入れ替えを実行できます。上記のベクトルの場合は、インデックス [1 2 3 4 5 6] が並へ替えられ、新しいインデックス [4 5 6 1 2 3] になります。次にこの関数では、このインデックス ベクトルを使用して要素の位置が変更されます。多次元配列の場合、fftshift では各次元のインデックス ベクトルを作成しなければなりません。コンマ区切りリストを使用すれば、この作業はずっと簡単になります。

次に、関数 fftshift を示します。

function y = fftshift(x)
    numDims = ndims(x);
    idx = cell(1,numDims);
    for k = 1:numDims
        m = size(x,k);
        p = ceil(m/2);
        idx{k} = [p+1:m 1:p];
    end
    y = x(idx{:});
end

この関数では、セル配列 idx にインデック スベクトルが保存されます。このセル配列の作成は比較的簡単です。N 次元ごとに、次元のサイズを決定し、中央に最も近い整数のインデックスを見つけます。次に、その次元の両半分を入れ替えるベクトルを作成します。

セル配列を使用してインデックス ベクトルとインデックス処理用のコンマ区切りリストを保存すると、fftshift では、 y = x(idx{:}) の演算のみで任意の次元の配列がシフトされます。明示的なインデックスを付ける場合は、次に示すように、関数で処理する次元ごとに、1 つの if ステートメントを記述しなければなりません。

    if ndims(x) == 1
        y = x(index1);
    else if ndims(x) == 2
        y = x(index1,index2);
        end
    end

コンマ区切りリストを使わずに、これを処理するもう 1 つの方法では、各次元間をループして、1 回に 1 つずつの次元を変換し、1 回ごとにデータを移動する方法があります。コンマ区切りリストを使用すれば、1 回の処理でデータを移動できます。コンマ区切りリストでは、任意数の次元の入れ替え操作が非常に簡単になります。

この情報は役に立ちましたか?