【问题标题】:Pad an matrix by replicating the edge values通过复制边缘值填充矩阵
【发布时间】:2015-08-29 20:46:19
【问题描述】:

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

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

/////////////////////////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];
        }
    }
}

谁能指出我正确的方向如何做到这一点?

【问题讨论】:

    标签: c matrix padding


    【解决方案1】:

    您是一次性错误的受害者。

    通常在 C 中,要迭代一个序列,您使用起始索引和 next_to_last 索引,方式如下:

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

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

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

    如果您想知道索引是否超出范围,请使用 &lt; 和 &gt;=:

    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];
    

    与宽度运行相同。

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2020-11-06
      • 2023-04-02
      • 1970-01-01
      • 2020-07-09
      相关资源
      最近更新 更多