逆(列)行主序变换

qon*_*onf 3 math

任何人都可以提供/参考多维行主序的“索引 -> 偏移”* 转换的逆转换。另外,(伪)代码将不胜感激。

举个例子,对引发我的问题的特定问题进行简化:我有一个 3 维数据层次结构,用 (a,b,c) 跨越的空间表示,其中 a、b 和 c 是大于或等于 0 的整数且小于 N_a、N_b 和 N_c。我想将数据表示为一维数组。然后按行主序给出“偏移量”,如下所示:

 int offset(a, b, c){
      return a*N_b*N_c + b*N_c + c;
}
Run Code Online (Sandbox Code Playgroud)

那么什么是逆变换,即:

int a(int offset);
int b(int offset);
int c(int offset);
Run Code Online (Sandbox Code Playgroud)

此外,如何将其推广到第 N 维索引?引发这个问题的问题是第五维的。

如果重要的话,我正在用 c/c++ 编写。

Mar*_*rot 5

如果指数计算为

offset = row + column*NUMROWS
Run Code Online (Sandbox Code Playgroud)

那么倒数就是

row = offset % NUMROWS
column = offset / NUMROWS
Run Code Online (Sandbox Code Playgroud)

其中%是模数,/是整数除法。

假设第一个元素位于偏移量 0、第 0 行和第 0 列。如果它们从 1 开始,则必须在适当的位置添加或减去 1。


对于更高的维度,您必须对每个度量重复此操作。

offset = x + WIDTH*(y + HEIGHT*(z + DEPTH*time));
Run Code Online (Sandbox Code Playgroud)

和相反的

x = offset % WIDTH
offset = offset / WIDTH

y = offset % HEIGHT
offset = offset / HEIGHT

z = offset % DEPTH
offset = offset / DEPTH

time = offset
Run Code Online (Sandbox Code Playgroud)

您还可以提取特定坐标:

z = (offset / (WIDTH * HEIGHT)) % DEPTH
Run Code Online (Sandbox Code Playgroud)