まずはこれ.一目で分かる多次元インデクス!
a を [4 by 3 by 2] なる 3 次元配列とすると,
A three dimensional [4 by 3 by 2] array |
その要素の番号は
Index / subscript correspondences of [4 by 3 by 2] array 'a' |
となるのだ~! この表の意味は,例えば「a(2,3,2)とa(2,6)とa(22)は同じ要素を指す!」ということ.行列(2次元配列)の場合は,真ん中と右に注目してもらえばOK. さっきの例では a(2,6) と a(22) だね.
もうわかった?ともかく説明しよう.
3 次元配列 a の参照の仕方は
- a(i1, i2, i3)
- a(i1, i2)
- a(i1)
通し番号 = (i3-1) * s(2) * s(1) + (i2-1) * s(1) + i1となる.方式 2 では i3 = 1, 方式 3 では i3 = 1, i2 = 1 を補えばよい.例えば,
(3, 1, 2) の要素の通し番号 = (2-1) * 3 * 4 + (1-1) * 4 + 3 = 15となるわけだ.上の図と見比べてみると,方式 1, 2, 3 と通し番号との対応がわかるだろう.
(3, 4) の要素の通し番号 = (1-1) * 3 * 4 + (4-1) * 4 + 3 = 15
(15) の要素の通し番号 = (1-1) * 3 * 4 + (1-1) * 4 + 15 = 15
多次元インデクス(サブスクリプト)と通し番号(リニアインデクス,リニアサブスクリプト)の相互変換は,sub2ind や ind2sub を使っても行える.
sub2ind は,多次元インデクスをリニアインデクスに変換する.
k = sub2ind( [4, 3, 2], 3, 1, 2 )はいずれも k = 15 を返す.
k = sub2ind( [4, 3, 2], 3, 4 )
k = sub2ind( [4, 3, 2], 15 )
一方,ind2sub は,リニアインデクスを多次元インデクスに変換する.
>> i1 = ind2sub( [4, 3, 2], 15 )
i1 =
15
>> [i1, i2] = ind2sub( [4, 3, 2], 15 )
i1 =
3
i2 =
4
>> [i1, i2, i3] = ind2sub( [4, 3, 2], 15 )
i1 =
3
i2 =
1
i3 =
2
となる.
このプロセスは何次元配列にでも適用できる.つまり,N 次元配列を M 個の数字からなるサブスクリプトで参照するときは (ここでは M < N とするよ), 3 次元配列を 2 個や 1 個の数字からなるサブスクリプトで参照したときと同様,余りの次元は全て展開されて並べられたものとして考えると良い.
ちなみに,インデクスのやりとりをするには,セル配列を使うのも便利だ.このプロセスは何次元配列にでも適用できる.つまり,N 次元配列を M 個の数字からなるサブスクリプトで参照するときは (ここでは M < N とするよ), 3 次元配列を 2 個や 1 個の数字からなるサブスクリプトで参照したときと同様,余りの次元は全て展開されて並べられたものとして考えると良い.
セル配列の使い方については当ブログの記事
も参照されたし.
[matlab 記事インデックスへ]