1

次の方法で長さ 360aの ArrayList に展開する 3x4x5x6 の Java double 配列があるとします。b

for (int i = 0; i<a.length; i++){
    for (int j = 0; j<a[0].length; j++){
        for (int k = 0; k<a[0][0].length; k++){
            for (int m = 0; m<a[0][0][0].length; m++){
                b.add(a[i][j][k][m]);
            }
        }
    }
}

のインデックスが与えられた場合b、対応する 4 タプルのインデックスを見つける簡単な方法はありますaか?

4

2 に答える 2

2

仮定して

  • bは一次元配列のインデックスです
  • i,j,k,mは、多次元配列の 4 つの結果のインデックスです
  • si,sj,sk,smは任意の次元のサイズです

あなたは基本的な数学を使うことができます、それは次のようなものでなければなりません

  • m = b % sm
  • k = (b / sm) % sk
  • j = (b / (sm*sk)) % sj
  • i = b / (sm*sk*sj)

基本的に、含まれている配列のサイズごとにすべてのインデックスを 1 ずつインクリメントし (サイズを乗算することによって)、その次元でラップします。

于 2012-09-14T18:11:41.543 に答える
1

ind2subMATLAB では、線形インデックスを添字に変換するために使用できます。

例えば。4 次元 (3 x 3 x 3 x 3) の行列:

#% The dimensions of n-dimensional matrix:
SizeVector = [ 3, 3, 3, 3 ];

#% Example linear index:
LinearIndex = 17;

[i1, i2, i3, i4 ] = ind2sub(SizeVector, LinearIndex);

i1 =
   2

i2 =
   3

i3 =
   2

i4 =
   1

これが正しいことを確認するには、これらの添え字から元の線形アドレスを手動で計算できます。

 (i4-1)*3^3 + (i3-1)*3^2 + (i2-1)*3^1 + (i1-1)*3^0 + 1

ans =
    17
于 2012-09-14T20:15:37.803 に答える