任何人都可以提供/参考多维行主序的“索引 -> 偏移”* 转换的逆转换。另外,(伪)代码将不胜感激。
举个例子,对引发我的问题的特定问题进行简化:我有一个 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++ 编写。
如果指数计算为
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)