快速 N 维索引转换
Fast N-dimensional index conversion
使用 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)
.
- 将转换字符键入 int 以用作向量C++的索引
- 为什么在 c++ 中索引字符串会发出隐式转换警告?
- 如何索引转换后的用户数据值?
- C++将向量迭代器转换为索引
- 快速 N 维索引转换
- 提升多索引 将索引转换为标记并在索引上循环
- 使用 ITK 将物理点转换为索引
- 将RGB颜色图像转换为OpenCV C 中的索引颜色图像类型
- 将一维数组的索引转换为二维数组
- 使用带有新 API 的编号索引的转换无效
- 阵列索引(转换为整数)用范围枚举
- 将 Python 转换为 C++ - lambda 中的索引
- Deque索引迭代器转换
- array:将一维数组的索引转换为多维数组的向量索引
- 将迭代器转换为标量索引
- 将一维"flattened"索引转换为 N 维数组的 N 维向量索引
- 将索引转换为迭代器
- 为静态强制转换的索引数组生成数组
- 类转换为索引和指针,并引用容器
- 在赋值(数组索引)时无法将' libraryname::ZlibCompressor '转换为' libraryn