【问题标题】:C - 2D ConvolutionC - 2D 卷积
【发布时间】:2017-01-03 20:56:58
【问题描述】:

我正在尝试用 C 语言做一个矩阵的卷积。

我尝试了一些方法,但无法正确完成。

N[WIDTH1][WIDTH2] 是输入矩阵,M[MASK_WIDTH1][MASK_WIDTH2] 是内核矩阵,P[][] 是输出矩阵。

第一次尝试:

void convolution_2D(int N[][WIDTH2], int M[][MASK_WIDTH2], int P[][WIDTH2]) {

// find center position of kernel (half of kernel size)
int kCenterX = MASK_WIDTH2 / 2;
int kCenterY = MASK_WIDTH1 / 2;

for (int i = 0; i < WIDTH1; ++i)              // rows
{
    for (int j = 0; j < WIDTH2; ++j)          // columns
    {
        for (int m = 0; m < MASK_WIDTH1; ++m)     // kernel rows
        {
            int mm = MASK_WIDTH1 - 1 - m;      // row index

            for (int n = 0; n < MASK_WIDTH2; ++n) // kernel columns
            {
                int nn = MASK_WIDTH2 - 1 - n;  // column index

                // index of input signal, used for checking boundary
                int ii = i + (m - kCenterY);
                int jj = j + (n - kCenterX);

                // ignore input samples which are out of bound
                if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2)
                    P[i][j] += N[ii][jj] * M[mm][nn];
            }
        }
    }
}

问题是边界值是错误的,因为我选错了 M 矩阵的值。例如,对于P[0][0],结果应该是,对于NP 5x5 和M 3x3:

P[0][0] = N[0][0]*M[1][1] + N[0][1]*M[1][2] + N[1][0]*M[2][1] + N[1][1]*M[2][2];

我需要的内核值是右下部分;相反,该代码选择了左上角,我无法编写代码来检查正确的值。

【问题讨论】:

  • 此代码假定调用函数时 P 的所有值都初始化为零。
  • mm和nn的意义何在?如果你只使用 m 和 n,它似乎可以工作。
  • 是的,P初始化为0;我觉得很愚蠢,但是....我认为它有效。我将检查输出值并关闭问题。谢谢!编辑:它有效!

标签: c matrix convolution


【解决方案1】:

我需要的内核值是右下部分;相反,该代码选择了左上角,我无法编写代码来检查正确的值。

这是因为您在计算 mmnn 时翻转了掩码索引。只需删除这些行并使用 mn 来索引掩码:

if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2)
    P[i][j] += N[ii][jj] * M[m][n];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多