使用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]
每次使用除法和模数都不够快。也许有一个聪明的伎俩很快就能做到这一点?使用缓存或类似的东西。
谢谢!
答案 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)
。