我有这个双 for 循环,其中我有行顺序和列顺序数组索引,这应该不利于性能。
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
/* Column-major order */
d = array_a[col*height +row];
if (d < 0) { d = 0; }
/* Row-major order */
/* Map from x=0,y=0 at buttom left corner to
0,0 at top left corner */
array_b[width*(height-1 -row) + col] = d;
}
}
是否有关于如何从一个重写到另一个的方法/方法?
当我尝试将最后一个重写为列顺序时,数据变得倾斜。不能改写吗?
桑德拉
原文由 Sandra Schlichting 发布,翻译遵循 CC BY-SA 4.0 许可协议
这永远不会很快,因为您可能会有许多缓存未命中,您要么必须步入一个间距较大的矩阵,要么进入另一个矩阵,这是无法逃脱的。这里的问题是计算机喜欢连续的内存访问靠近在一起,在您的算法中,由于
col*height
术语,array_a 的索引一次跳过高度元素的索引并非如此。要解决这个问题,您可以切换 for 循环,但是您会遇到与 — 中的array_b
width*(height-1 -row)
术语相同的问题。您可以重写其中一个数组以匹配另一个数组的顺序,但是在进行重写的代码中您会遇到完全相同的问题,因此这取决于您是否需要在相同的数据,如果你这样做,那么首先重写一个像 Poita_ 描述的矩阵是有意义的,否则你最好让算法保持原样。