8.1 インデックス式
インデックス式を使用すると、ベクトル、行列 (2 次元)、または高次元配列の選択した要素を参照または抽出できます。配列は、 コンポーネント インデックス、 線形インデックス、および 論理インデックスの 3 つの方法のいずれかでインデックス付けできます。
コンポーネントのインデックス作成
コンポーネントインデックスは、スカラー、ベクトル、範囲、または特殊演算子「:' は、行全体、列全体、または高次元のスライスを選択します。
コンポーネント インデックス式は、カンマで区切られたM個の式を囲む括弧のセットで構成されます 。個々のインデックス値、つまりコンポーネントは、それが適用されるオブジェクトのそれぞれの次元に使用されます。つまり、最初のインデックス コンポーネントはオブジェクトの最初の次元 (行) に使用され、2 番目のインデックス コンポーネントはオブジェクトの 2 番目の次元 (列) に使用される、というように続きます。インデックス コンポーネントの数M は、 インデックス式の次元を定義します。2 つのコンポーネントを持つインデックスは、2 つの次元を持つため、2-D インデックスと呼ばれます。
最も単純なケースでは、1) すべてのコンポーネントはスカラーであり、2) インデックス式Mの次元は、それが適用されるオブジェクトの次元と等しくなります。例:
A = reshape (1:8, 2, 2, 2) # Create 3-D array
A =
ans(:,:,1) =
1 3
2 4
ans(:,:,2) =
5 7
6 8
A(2, 1, 2) # second row, first column of second slice
# in third dimension: ans = 6
特定の次元で返されるオブジェクトのサイズは、インデックス式の対応するコンポーネントの要素数に等しくなります。すべてのコンポーネントがスカラーの場合、結果は単一の出力値になります。ただし、いずれかのコンポーネントがベクトルまたは範囲の場合、返される値はそれぞれの次元のインデックスの直積になります。例:
A([1, 2], 1, 2) ≡ [A(1,1,2); A(2,1,2)] ⇒ ans = 5 6
返される値の合計数は、各インデックス コンポーネントに対して返される要素の数の積です。上記の例では、合計は 2*1*1 = 2 要素です。
返されるオブジェクトの特定の次元のサイズは、その次元のインデックス式の要素数に等しいことに注意してください。上記のコードでは、最初のインデックス コンポーネント ( [1, 2]) は行ベクトルとして指定されていますが、その形状は重要ではありません。重要な点は、コンポーネントが 2 つの値を指定しているため、結果の最初の次元のサイズは 2 である必要があることです。また、最初の次元は行に対応しているため、全体的な結果は列ベクトルになります。
A(1, [2, 1, 1], 1) # result is a row vector: ans = [3, 1, 1] A(ones (2, 2), 1, 1) # result is a column vector: ans = [1; 1; 1; 1]
最初の行は、特定の次元の出力のサイズが、それぞれのインデックス コンポーネントの要素数に等しいことを再度示しています。この場合、出力には 2 番目の次元 (列に対応) に 3 つの要素があるため、結果は行ベクトルになります。この例では、インデックス式の繰り返しエントリを使用して、出力の要素を複製する方法も示しています。最後の例では、インデックス コンポーネントの形状は無関係であり、要素の数 (2x2 = 4) だけが重要であることがさらに証明されています。
上記のルールは、インデックス式の次元が 1 より大きい場合 ( M > 1 ) に適用されます。ただし、1 次元のインデックス式の場合は特別なルールが適用され、出力の形状はインデックス コンポーネントの形状によって決まります 。例:
A([1, 2]) # result is a row vector: ans = [1, 2] A([1; 2]) # result is a column vector: ans = [1; 2]
A ( P ) の形状規則は次のとおりです。
AまたはPの少なくとも 1 つが2 次元以上である場合、 A ( P ) はPの形状になります。これは、変数の少なくとも 1 つが 2 次元行列または N 次元配列である場合に発生します。
AとPの両方が 1 次元ベクトルの場合、A ( P ) はA自体の形状になります。特に、Aが行ベクトルの場合、 Pの形状に関係なく、 A ( P ) も行ベクトルになります。 Aが列ベクトルの 場合も同様です。
コロン(':') は、指定された次元のすべての要素を選択するためのインデックスコンポーネントとして使用できます。行列が与えられた場合、
A = [1, 2; 3, 4]
次の式はすべて同等であり、行列の最初の行を選択します。
A(1, [1, 2]) # row 1, columns 1 and 2 A(1, 1:2) # row 1, columns in range 1-2 A(1, :) # row 1, all columns
1 次元インデックスの特殊なケースでコロンが使用されると、結果は常に列ベクトルになります。コロン インデックスを使用して列ベクトルを作成することは、非常に頻繁に使用されるコード イディオムであり、 reshapeこのケースを呼び出すよりも高速で、一般的に明確です。
A(:) # result is column vector: ans = [1; 2; 3; 4] A(:)' # result is row vector: ans = [1, 2, 3, 4]
インデックス式では、キーワードはend特定の次元の最後のエントリを自動的に参照します。このマジック インデックスは範囲でも使用でき、通常はインデックス作成前に配列境界を呼び出しsizeたりlength収集したりする必要がなくなります。例:
A(1:end/2) # first half of A => [1, 2] A(end + 1) = 5; # append element A(end) = []; # delete element A(1:2:end) # odd elements of A => [1, 3] A(2:2:end) # even elements of A => [2, 4] A(end:-1:1) # reversal of A => [4, 3, 2, 1]
詳細については、 を参照してください"end" keyword。
線形インデックス
多次元オブジェクトで 1 次元インデックスを使用することもできます。これは線形インデックスとも呼ばれます。この場合、多次元配列の要素は、Fortran のように列優先で取得されます。つまり、配列の列は互いに積み重ねられて列ベクトルを形成し、単一の線形インデックスがこのベクトルに適用されていると想定されます。
A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; A(4) # linear index of 4th element in 2-D array: ans = 2 A(3:5) # result has shape of index component: ans = [7, 2, 5] A([1, 2, 2, 1]) # result includes repeated elements: ans = [1, 4, 4, 1]
論理インデックス
true論理値は、行列やセル配列のインデックスにも使用できます。論理配列でインデックスを作成すると、結果は論理配列の各部分 に対応する値を含むベクトルになります。次の例はこれを示しています。
data = [ 1, 2; 3, 4 ];
idx = [true, false; false true];
data(idx)
⇒ ans = [ 1; 4 ]
idx = (data <= 2);
data(idx)
⇒ ans = [ 1; 2 ]
配列を作成する代わりに、 上記のコードで をidx置き換えることも可能です 。data(idx)data( data <= 2 )
論理インデックス式のサイズは通常、インデックス付けされる配列のサイズと同じですが、これは必須条件ではありません。論理インデックスが配列と異なるサイズの場合、線形インデックス付けの場合と同様に、配列の要素は線形順序に基づいて論理インデックスの要素と照合されます。
data = [ 1, 2, 3; 4, 5, 6 ];
idx = [ true, false, false, true ];
data(idx)
⇒ ans = [ 1 5 ] # idx selected the 1st and 4th position elements
論理インデックスが配列より大きい場合、いずれかの true 値が配列内の要素数より大きい線形位置を選択しようとすると、範囲外エラーが発生します。
idx = [ true, true, false; false, true, false; true; false; false ];
data(idx)
⇒ ans = [ 1; 2; 5; 3 ] # returns positions 1, 3, 4, 5 in a column
idx = [ true, true, false; false, true, false; true; false; true ];
data(idx)
⇒ error: a(9): out of bound 6 (dimensions are 2x3)
配列サイズ外の論理インデックスの false 要素は無視されますが、論理インデックスの 9 番目の要素が true の場合、配列の存在しない 9 番目の要素を選択しようとするため、エラーが発生します。
Advanced Indexing