新堆栈溢出。我正在努力加快我必须掩盖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方面的专业知识。任何帮助将不胜感激。
答案 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]
。因此无法进一步简化它。