2013年6月27日木曜日

matlab: 一目で分かる多次元インデクス

matlab の配列参照に使うインデクスの基礎について.

まずはこれ.一目で分かる多次元インデクス!
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 の参照の仕方は
  1. a(i1, i2, i3)
  2. a(i1, i2)
  3. a(i1)
の3通り.s = size(a) とすると,s = [4,3,2] であって,式で書けば
通し番号 = (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
(3, 4) の要素の通し番号 = (1-1) * 3 * 4 + (4-1) * 4 + 3 = 15
(15) の要素の通し番号 = (1-1) * 3 * 4 + (1-1) * 4 + 15 = 15
となるわけだ.上の図と見比べてみると,方式 1, 2, 3 と通し番号との対応がわかるだろう.

多次元インデクス(サブスクリプト)と通し番号(リニアインデクス,リニアサブスクリプト)の相互変換は,sub2ind や ind2sub を使っても行える.

sub2ind は,多次元インデクスをリニアインデクスに変換する.
k = sub2ind( [4, 3, 2], 3, 1, 2 )
k = sub2ind( [4, 3, 2], 3, 4 )
k = sub2ind( [4, 3, 2], 15 )
はいずれも k = 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 個の数字からなるサブスクリプトで参照したときと同様,余りの次元は全て展開されて並べられたものとして考えると良い.

ちなみに,インデクスのやりとりをするには,セル配列を使うのも便利だ.
セル配列の使い方については当ブログの記事
も参照されたし.

[matlab 記事インデックスへ]

0 件のコメント:

コメントを投稿