通过复制边缘值填充矩阵

时间:2015-08-29 20:46:19

标签: c matrix padding

我的程序会创建一个矩阵。它移动并将其中心化为更大的一个。现在我想填充使用第一个矩阵的边缘值创建的边框,使其看起来像这样:visual example

到目前为止,我有以下代码,但它似乎无法正常工作(让我们将矩阵视为具有宽度,高度和边框的图像):

/////////////////////////Up/Down Fill////////////////////////////
for(i=border;i<(width+border);i++){
    for(j=0;j<(height+2*border);j++){
        if(j<border){
            fmatr[i][j]=fmatr[i][border];
        }
        else if(j>(height+border)){
            fmatr[i][j]=fmatr[i][(height+border)];
        }
    }
}

/////////////////////////Left/Right//////////////////////////////
for(i=0;i<(width+2*border);i++){
    for(j=0;j<(height+2*border);j++){
        if(i<border){
            fmatr[i][j]=fmatr[border][j];
        }
        else if(i>(width+border)){
            fmatr[i][j]=fmatr[(width+border)][j];
        }
    }
}

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您是 off-one错误的受害者

通常在C中,要迭代一个序列,你就这样使用了start index和next_to_last索引:

for (i = first; i < next_to_last; ++i)

这很方便,因为next_to_last索引是第一个加上长度:

for (i = first; i < first + length; ++i)

如果您想知道索引是否超出范围,请使用<>=

out_of_bounds = i < first || i >= next_to_last;
out_of_bounds = i < first || i >= first + length;

所有这一切都很酷,因为当你有两个连续的序列时,你不必在从一个到另一个时进行任何调整:

for (i = 0; i < a; ++i) ...;
for (; i < b; ++i) ...;
for (; i < c; ++i) ...;

但是如果你想访问一个序列的最后一个元素,你必须记住减去一个:

last = array[next_to_last - 1];
last = array[first + length - 1];

所以当你说:

    else if(j>(height+border)){
        fmatr[i][j] = fmatr[i][(height+border)];
    }

你可能意味着:

    else if(j >= height + border){
        fmatr[i][j] = fmatr[i][height + border - 1];
    }

和witdh一样。

那说我会把内循环写成两个循环。 IMO你的意图更加清晰:

for (j = 0; j < border; ++j)
    fmatr[i][j] = fmatr[i][border];
for (j = height + border; j < height + 2 * border; ++j)
    fmatr[i][j]=fmatr[i][height + border - 1];

与宽度运行相同。