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
となるはず…