快速 N 维索引转换

Fast N-dimensional index conversion

本文关键字:转换 索引 快速      更新时间:2023-10-16

使用 C++ 将整数(例如i)转换为N维矩阵中的坐标的最快方法是什么?

例如,给定i= 15,N= 3,矩阵大小 = {4,3, 2 },结果应为 {3, 0, 1}。

使用了以下方法:

coord[n] = (i / stride[n]) % dimension_size[n],

其中stride[n]预先计算为dimension_size[0] * dimension_size[1] * ..dimension_size[n-1]

每次都像这样使用除法和模还不够快。也许有一个聪明的技巧可以非常快速地做到这一点?使用缓存或类似的东西。

谢谢!

您的示例

B[q][r][m] = A[m][func1(r)][func2(q)]

不需要反转i来查找 q,r,m,但确实将 B 的最低重要索引映射到 A 的最重要索引,因此可能会出现缓存问题。如果你通过递增 i 并派生 q,r,m 来实现它,那么这与在嵌套循环中递增 q,r,m 具有相同的效果,并且将 q,r,m 转换为 i 可能比反之亦然更快,但不太可能成为瓶颈。

根据数据的大小,可能值得首先反转 A,或者在外循环中创建具有固定 q 的 A 切片。

如果我正确理解了你的问题; 您正在研究如何索引到表示多维矩阵的平面数组中?

由于像数组这样的矩阵是连续存储在内存中的,因此索引到行主序的MxN矩阵的一般想法具有以下公式:

如果矩阵MxN矩阵具有轴(i,j)则平面数组进入MxN矩阵的索引位置matrix[i][j] = array[i*M + j]

这个想法可以推广到更高的维度:

如果矩阵MxNxO具有轴(i,j,k)则平面的索引位置 数组到MxNxO矩阵中是matrix[i][j][k] = array[i*(N*M) + j*M + k]

这种模式将继续适用于高维矩阵。

如果矩阵MxNxOxP有轴(i,j,k,l)那么...matrix[i][j][k][l] = array(i*(O*N*M) + j*(N*M) + k*M + l).