删除此帖子,如果您可以删除我的所有其他评论,请删除此帖子,有毒的版主!!!!
正如 @RetiredNinja 所报告的,您需要 two 缓冲区来完成此任务。矩阵的每个元素既用作值的源,又用作任务完成之前存储结果的目的地。
对你的方法感到困扰(使用
fakeRow
)我将你的代码提炼为以下内容,结果报告如下:
void blur( int height, int width ) {
for (int i = 0; i< height; i++) {
for (int j = 0; j< width; j++) {
int dec = 0;
int fakeRow = i;
int cycle = 1;
double calcAv = 1;
if (i > 0) {
cycle += 1;
dec = 1;
}
if (i < height - 1)
cycle += 1;
do {
if (cycle == 1 && fakeRow < height - 1)
fakeRow += 1;
calcAv += 1;
printf( "(%d,%d) ", fakeRow - dec, j );
if (j > 0) {
printf( "(%d,%d) ", fakeRow - dec, j-1 );
calcAv += 1;
}
if (j < width - 1)
{
printf( "(%d,%d) ", fakeRow - dec, j+1 );
calcAv += 1;
}
dec = 0;
cycle -= 1;
} while (cycle != 0);
printf( " ... CalcAv %f\n", calcAv );
}
}
}
int main( void ) {
blur( 3, 3 );
return 0;
}
结果:
(0,0) (0,1) (1,0) (1,1) ... CalcAv 5.000000
(0,1) (0,0) (0,2) (1,1) (1,0) (1,2) ... CalcAv 7.000000
(0,2) (0,1) (1,2) (1,1) ... CalcAv 5.000000
(0,0) (0,1) (1,0) (1,1) (2,0) (2,1) ... CalcAv 7.000000
(0,1) (0,0) (0,2) (1,1) (1,0) (1,2) (2,1) (2,0) (2,2) ... CalcAv 10.000000
(0,2) (0,1) (1,2) (1,1) (2,2) (2,1) ... CalcAv 7.000000
(1,0) (1,1) (2,0) (2,1) ... CalcAv 5.000000
(1,1) (1,0) (1,2) (2,1) (2,0) (2,2) ... CalcAv 7.000000
(1,2) (1,1) (2,2) (2,1) ... CalcAv 5.000000
使用非常规
fakeRow
,您的代码正确地形成了适当的矩阵索引(令我惊讶!)。然而,元素的CalcAv
计数器是差一。 (一个常见的错误和一个简单的修复留给您执行。)