2

多次元行優先順序の「インデックス -> オフセット」* 変換の逆を提供/参照できますか。また、(疑似)コードをいただければ幸いです。

例を挙げて、私の質問を促した特定の問題の単純化: 私は 3 次元のデータ階層を持っています。 N_a、N_b、および N_c よりも小さい。データを一次元配列で表現したい。行優先順の「オフセット」は、次のように与えられます。

 int offset(a, b, c){
      return a*N_b*N_c + b*N_c + c;
}

次に、逆変換とは何ですか。つまり、次のとおりです。

int a(int offset);
int b(int offset);
int c(int offset);

さらに、これをN次元の索引付けに一般化するにはどうすればよいですか? この質問を促した問題は 5 次元の問題です。

念のため、私は c/c++ で書いています。

4

1 に答える 1

4

インデックスが次のように計算される場合

offset = row + column*NUMROWS

その逆は

row = offset % NUMROWS
column = offset / NUMROWS

ここで、%はモジュラス、/は整数除算です。

これは、最初の要素がオフセット 0、行 0、列 0 にあることを前提としています。それらが 1 から始まる場合は、適切な場所で 1 を加算または減算する必要があります。


より高い次元の場合、メジャーごとにこれを繰り返す必要があります。

offset = x + WIDTH*(y + HEIGHT*(z + DEPTH*time));

そして逆

x = offset % WIDTH
offset = offset / WIDTH

y = offset % HEIGHT
offset = offset / HEIGHT

z = offset % DEPTH
offset = offset / DEPTH

time = offset

特定の座標を抽出することもできます。

z = (offset / (WIDTH * HEIGHT)) % DEPTH
于 2012-05-31T06:11:06.403 に答える