yucken の業務上電脳 Tips 日記、なのだよ。-弐式-

いまさら電脳 Tips を書いてみむとして、するなり.元々は広い意味での電脳(コンピュータ)の Tips を書いていたのですが,いつのまにか,解析ツールの「電脳 ruby」の Tips がメインに.‥‥‥で,5 年間放置してたのだけどやはり Tips を書くブログがないと不便なのでふっかちさせたのであります.(・)>

IDL の多次元配列のインデックス番号

具体例として、[ 3, 5, 7 ] の三次元配列の場合 (例えば、arr = indgen( 3, 5, 7 ) )、

arr[ i1, i2, i3 ] = arr[ i ]

となる i は

i = i1 + i2 * 3 + i3 * 3 * 5.

なので、一般的には、n1 x n2 x ... x nm の形からなる m 次元の配列 ( arr = indgen( n1, n2, ..., nm ) ) について

arr[ i1, i2, ..., im ] = arr[ i ]

となる i は、おそらく

i = i1 + i2 * n1 + ... + ik * nk-1 * nk-2 * ... n1 + ...
     + im * nm-1 * nm-2 * ... * n1

となるはず。

ちなみに、arr = indgen( n1 * n2 * ... * nm ) を、arr = reform( arr, n1, n2, ..., nm ) として一次元配列を多次元配列に変換しても、

arr[ i ] = i

となるようです。

逆変換

arr = indgen( 3, 5, 7 ) について arr[ i ] = arr[ i1, i2, i3 ] となる i1, i2, i3 を求めることを考える.

たとえば、i = 26 の場合.

i1 = 26 mod 3 = 2
x1 = 26 - 2  = 24
i2 = ( x1 / 3 ) mod 5 = ( 24 / 3 ) mod 5 = 3
x2 = x1 - 3 * 3  = 26 - 2 - 3 * 3 = 15
i3 = ( x2 / 3 / 5 ) mod 7 = 1 mod 7 = 1

一般には,

i1 = i mod n1
x1 = i - i1
i2 = ( x1 / n1 ) mod n2
x2 = x1 - i2 * n1
i3 = ( x2 / n1 / n2 ) mod n3
...
xm = xm-1 - im * nm-1
im+1 = ( xm / n1 / n2 / ... / nm ) mod nm+1

となるはず…