ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

行列のインデックス

単一要素へのアクセス

行列内の特定の要素を参照するには、次の構文を使用してその行番号と列番号を指定します。ここで、A は行列を表す変数です。必ず行を先に指定して、次に列を指定します。

A(row, column)

たとえば、4 行 4 列の魔方陣 A の場合は、次のように指定します。

A = magic(4)
A =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

4 行目の 2 列目の要素にアクセスするには、次のように指定します。

A(4, 2)
ans =
    14

2 次元よりも大きい配列の場合は、rowcolumn インデックスを使って追加のインデックスを指定します。「多次元配列」の節を参照してください。

線形インデックス操作

MATLAB® では単一の添字 A(k) を使って、行列の要素を参照することもできます。MATLAB では行列や配列を、MATLAB コマンドウィンドウで表示される状態ではなく、単一列の要素として保存します。このような単一列は、行列内のすべての列を順次後ろに追加して作成します。

したがって、次のような行列 A は、

A = [2 6 9; 4 2 8; 3 5 1]
A =
     2     6     9
     4     2     8
     3     5     1

メモリ内には次のような順序で保存されます。

2, 4, 3, 6, 2, 5, 9, 8, 1

行列 Aの行 3、列 2 の要素 (値 = 5) は、実際の保存内容では、要素 6 としても識別できます。この要素にアクセスするには、標準の構文 A(3,2) を使用するか、線形インデックスと呼ばれる A(6) を使用できます。

さらに添字を与えると、MATLAB はユーザーが設定した配列を基に、ストレージ列の中のインデックスを計算します。たとえば、配列のサイズが [d1 d2] である 2 次元配列 A を考えます。ここで、d1 は配列の行数で d2 は列数です。行と列を表す 2 つの添字 (i, j) を指定すると、オフセットは次のようになります。

(j-1) * d1 + i

A(3,2) と指定すると、MATLAB は、A のストレージ列を (2-1) * 3 + 3、つまり、6 として算出します。列の要素番号 6 を見ると、5 になっています。

インデックス付け形式を制御する関数

行と列の添字の代わりに線形インデックスを使用したい場合、関数 sub2ind を使って線形インデックスに変換できます。前の節に記載されている 3 行 3 列の A では、sub2ind は (3,2) の標準の行と列のインデックスを線形インデックス 6 に変換します。

A = [2 6 9; 4 2 8; 3 5 1];

linearindex = sub2ind(size(A), 3, 2)
linearindex = 
     6

線形インデックスに対応する行と列を得るには、関数 ind2sub を使用します。

[row col] = ind2sub(size(A), 6)
row =
     3
col =
     2

複数の要素へのアクセス

次に示す 4 行 4 列の A の場合、以下のように入力することで、A の 4 列目の要素の総和を計算できます。

A = magic(4);
A(1,4) + A(2,4) + A(3,4) + A(4,4)

コロン演算子を使用して、この式のサイズを小さくすることができます。コロンを含む添字の式は、行列の一部を参照します。式

A(1:m, n)

は、行列 A の列 n1 行から m 行の要素を参照します。この表記法を使用して、A の第 4 列の総和をより簡単に計算できます。

sum(A(1:4, 4))

非連続要素

行列内の非連続要素を参照するには、ステップ値と共にコロン演算子を使用します。この式の中の m:3:n は、行列の中を 2 個おきに要素 -10 を代入することを意味します。この例では線形インデックスを使用している点に注意してください。

B = A;

B(1:3:16) = -10
B =
   -10     2     3   -10
     5    11   -10     8
     9   -10     6    12
   -10    14    15   -10

MATLAB は、1 つの配列を他の配列のインデックスとして使用する、一種の配列インデックスをサポートします。この種のインデックス付けは、インデックス配列の要素の値、または位置に基づきます。

たとえば、次の配列 B は、配列 A の要素 1367、および、10 へのインデックス付けを行う、値ベースのインデックス付けです。この場合、配列 B数値 は、A 内の対応する要素を指定します。

A = 5:5:50
A =
     5    10    15    20    25    30    35    40    45    50
B = [1 3 6 7 10];

A(B)
ans =
     5    15    30    35    50

ベクトルに他のベクトルでインデックスを付ける場合、インデックスされたベクトルの方向は出力に使用されます。

A(B')
ans =

     5    15    30    35    50
A1 = A'; A1(B)
ans =

     5
    15
    30
    35
    50

ベクトルに非ベクトルでインデックスを付ける場合、インデックスの型が使用されます。

C = [1 3 6; 7 9 10];
A(C)
ans =

     5    15    30
    35    45    50

キーワード end

MATLAB は、配列の特定の次元の最後の要素を指定する end というキーワードを提供しています。このキーワードは、行列内の列数や行数をプログラムが把握できない場合に便利です。前述の例の式は、次の内容に置き換えることができます。

B(1:3:end) = -10

    メモ   MATLAB ではキーワード end にはいくつかの意味があります。前述のように使用することも、if ブロックや for ブロックなどの条件付きのコードブロックの終了用、あるいは入れ子関数を終了するために使用することもできます。

行または列のすべての要素の指定

コロンは単独で、行列の行と列のすべての要素を参照します。次の構文を使用すると、4 行 4 列の魔方陣 A の第 2 列のすべての要素の総和を計算できます。

sum(A(:, 2))
ans =
    34

線形インデックスと共にコロンを使用することで、行列全体のすべての要素を参照できます。この例では行列 A の全要素を、列方向に順に表示します。

A(:)
ans =
    16
     5
     9
     4
     .
     .
     .
    12
     1

配列のインデックス付けにおける論理式の使用

論理配列のインデックスは、インデックス配列 B位置に基づき、配列 A の要素を指定します。この演算のマスキング タイプにおいて、インデックス配列の各 true 要素は、アクセスされている配列への位置のインデックスとして取り扱われます。

次の例では、B は論理値 1 と 0 から構成される行列です。B のこれらの要素の位置は、A のどの要素が式 A(B) によって指定されるかを決めます。

A = [1 2 3; 4 5 6; 7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9

B = logical([0 1 0; 1 0 1; 0 0 1]);
B =
     0     1     0
     1     0     1
     0     0     1

A(B) 
ans =
     4
     2
     6
     9

関数 find は、B の非ゼロ要素の線形インデックスを返すので論理配列で効果的であり、A(B) を解釈するのに役立ちます。

find(B)
ans =
     2
     4
     8
     9

論理インデックス - 例 1

この例では、条件 A > 0.5 を満たす論理配列 B を作成し、B 内の 1 の位置を基に A にインデックスを付けます。

rng(0,'twister');     % Reset the random number generator
A = rand(5);
B = A > 0.5;
A(B) = 0
A =

         0    0.0975    0.1576    0.1419         0
         0    0.2785         0    0.4218    0.0357
    0.1270         0         0         0         0
         0         0    0.4854         0         0
         0         0         0         0         0

これを簡単に表すと、以下のようになります。

A(A > 0.5) = 0

論理インデックス - 例 2

次の例では、論理インデックスを使って魔方陣内の素数位置を明らかにして非素数を 0 に設定します。

A = magic(4)
A =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

B = isprime(A)
B =
     0     1     1     1
     1     1     0     0
     0     1     0     0
     0     0     0     0

A(~B) = 0;                       % Logical indexing

A
A =
     0     2     3    13
     5    11     0     0
     0     7     0     0
     0     0     0     0
find(B)
ans =
     2
     5
     6
     7
     9
    13

より小さな配列の論理インデックス付け

通常は、論理インデックス配列は、インデックス付けされている配列と同数の要素をもつべきですが、これは必ずしも必要ではありません。配列のインデックス付けは、(より大きい次元ではなく) より小さな次元であることも可能です。

A = [1 2 3;4 5 6;7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9

B = logical([0 1 0; 1 0 1])
B =
     0     1     0
     1     0     1

isequal(numel(A), numel(B))
ans =
     0

A(B)
ans =
     4
     7
     8

MATLAB は、下記の配列 C におけるように、インデックス配列の欠損要素をゼロに設定して取り扱います。

% Add zeros to indexing array C to give it the same number of 
% elements as A.
C = logical([B(:);0;0;0]);

isequal(numel(A), numel(C))
ans =
     1

A(C)
ans =
     4
     7
     8

異なるタイプの配列をもつシングルコロン インデックス

標準の MATLAB 配列にシングルコロンを使用してインデックス付けする場合、MATLAB は列ベクトルを返します。下記の変数 n を参照してください。構造体やセル配列にインデックスを付ける場合、コンマで区切られたリストが出力されます (詳細は「構造体配列内のデータへのアクセス」「セル配列内のデータへのアクセス」を参照)。

3 種類の配列の作成:

n = [1 2 3; 4 5 6];
c = {1 2; 3 4};
s = cell2struct(c, {'a', 'b'}, 1);  s(:,2)=s(:,1);

次のように、それぞれにシングルコロンのインデックスを使用します。

n(:)              c{:}             s(:).a
ans =             ans =            ans =
     1                 1                1
     4            ans =            ans =
     2                 3                2
     5            ans =            ans =
     3                 2                1
     6            ans =            ans =
                       4                2

代入のインデックス付け

ある行列から他の行列に値を代入する場合、この節で説明するインデックスのスタイルのいずれかを使用することができます。行列の代入ステートメントは、次の条件を満たす必要があります。

代入 A(J,K,...) = B(M,N,...) において、添字 JKMN などは、以下のすべてが true の場合、スカラー、ベクトル、または配列になります。

  • B に対して指定された添字の数は 1 に等しい後続の添字を含まず、関数 ndims(B) を超えません。

  • A に指定された非スカラーの添字の数は、B に指定された非スカラーの添字の数に等しくなります。たとえば、A(5, 1:4, 1, 2) = B(5:8) は、式の両辺が 1 つの非スカラーの添字を使用しているので有効です。

  • A に対して指定されたすべての非スカラー添字の次数と長さは、B に指定された非スカラーの添字の次数と長さに一致します。たとえば、A(1:4, 3, 3:9) = B(5:8, 1:7) は、式の両辺は (1 つのスカラー添字 3 を無視して) 7 要素の添字が続く 4 要素の添字を使用するので有効です。

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