C-2D卷积
我想用C语言做一个矩阵的卷积 我试过一些东西,但做不好C-2D卷积,c,matrix,convolution,C,Matrix,Convolution,我想用C语言做一个矩阵的卷积 我试过一些东西,但做不好 N[WIDTH1][WIDTH2]是输入矩阵,M[MASK\u WIDTH1][MASK\u 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 kCente
N[WIDTH1][WIDTH2]
是输入矩阵,M[MASK\u WIDTH1][MASK\u 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];
}
}
}
}
我需要的内核值是右下部分;相反,该代码选择左上部分,我无法编写代码来检查正确的值
我需要的内核值是右下部分;相反,该代码选择左上部分,我无法编写代码来检查正确的值
这是因为在计算mm
和nn
时翻转遮罩索引。只需删除这些行,然后使用m
和n
索引掩码:
if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2)
P[i][j] += N[ii][jj] * M[m][n];
如果(ii>=0&&ii=0&&jj
此代码假设调用函数时P的所有值都初始化为零。mm和nn的意义是什么?如果你只使用m和n,它看起来会起作用;我觉得自己很愚蠢,但是。。。。我认为它有效。我将检查输出值并结束问题。非常感谢。编辑:这很有效!
if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2)
P[i][j] += N[ii][jj] * M[m][n];