断开或合并循环在C中的阵列上



假设我有3个阵列imageblurout,所有尺寸m×N×3。

我想计算阵列 image中每个像素的双边梯度(current_pixel-(present_previous next_pixel(/2(/2(在x和y尺寸上,将其除以某些浮点,然后从相应的像素的值添加。数组blur,最后将结果放入数组out

我的问题是,在C中,最有效的方法是什么(关于内存访问速度和计算效率(:

一个循环立即索引3个数组:

for (i = 0, j = 0, k = 0 ; i < M-1, j < N-1, k < 3 ; i++, j++, k++):
    out[i][j][k] = (2 * image[i][j][k] - image[i+1][j][k] - image[i][j+1][k]) / 2. + lambda * blur[i][j][k]

两个循环仅索引两个数组:

for (i = 0, j = 0, k = 0 ; i < M-1, j < N-1, k < 3 ; i++, j++, k++):
    out[i][j][k] = (2 * image[i][j][k] - image[i+1][j][k] - image[i][j+1][k]) / 2.
for (i = 0, j = 0, k = 0 ; i < M-1, j < N-1, k < 3 ; i++, j++, k++):
    out[i][j][k] += lambda * blur[i][j][k]

(对于可读性,我只写了一个简单的前向梯度,但是上面给出了完整的公式(。

还是另一种更快的方法?我正在为x86_64 cpus编程。

一次循环索引3个阵列将使编译器更容易优化。但是您很可能会检查并测试它。

最新更新