快速N维索引转换

时间:2018-03-27 13:19:39

标签: c++ algorithm

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

E.g。给定 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]

每次使用除法和模数都不够快。也许有一个聪明的伎俩很快就能做到这一点?使用缓存或类似的东西。

谢谢!

2 个答案:

答案 0 :(得分: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切片。

答案 1 :(得分:0)

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

由于像数组这样的矩阵在内存中连续存储,因此为行主要顺序索引到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)