如何优化3d阵列查找

时间:2018-11-06 04:58:22

标签: c optimization multidimensional-array compiler-optimization

新堆栈溢出。我正在努力加快我必须掩盖3d数组中某些元素的方法。我的代码如下:

for (i = 1; i < height-1; i++)
for (j = 1; j < width-1; j++)
  {
    tmp = 
          mask[1][0]*a[i][j-1][0]+
          mask[0][1]*a[i-1][j][0]+
          mask[1][1]*a[i][j][0]+
          mask[2][1]*a[i+1][j][0]+
          mask[1][2]*a[i][j+1][0];
    if (tmp>255)
          tmp = 255;
    else if (tmp<0)
          tmp = 0;
    c[i][j][0] = tmp;
    tmp = 
          mask[1][0]*a[i][j-1][1]+
          mask[0][1]*a[i-1][j][1]+
          mask[1][1]*a[i][j][1]+
          mask[2][1]*a[i+1][j][1]+
          mask[1][2]*a[i][j+1][1];
    if (tmp>255)
          tmp = 255;
    else if (tmp<0)
          tmp = 0;
    c[i][j][1] = tmp;
    tmp = 
          mask[1][0]*a[i][j-1][2]+
          mask[0][1]*a[i-1][j][2]+
          mask[1][1]*a[i][j][2]+
          mask[2][1]*a[i+1][j][2]+
          mask[1][2]*a[i][j+1][2];
    if (tmp>255)
          tmp = 255;
    else if (tmp<0)
          tmp = 0;
    c[i][j][2] = tmp;
  }

我已经通过展开外部for循环进行了一些优化,但是我需要使其更快。我知道必须有一种方法可以使用指针以更有效的方式访问3d内存地址,但是我没有C方面的专业知识。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以引入另一个循环k,以减少tmp的使用3倍。

for (i = 1; i < height-1; i++)
{
    for (j = 1; j < width-1; j++)
    {
        for (k=0; k<3; k++)
        {
            tmp = 
                mask[1][0]*a[i][j-1][k]+
                mask[0][1]*a[i-1][j][k]+
                mask[1][1]*a[i][j][k]+
                mask[2][1]*a[i+1][j][k]+
                mask[1][2]*a[i][j+1][k];
            if (tmp>255)
                tmp = 255;
            else if (tmp<0)
                tmp = 0;
            c[i][j][k] = tmp;
        }
    }
}

您正在使用mask[1][0][0][1][1][1],但没有使用[1][0][2][0]。因此无法进一步简化它。