我试图创建一种将矩阵与内核进行卷积的算法,我试图使用C来实现这一点,但是我不明白如何做到这一点,我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#define ROW 10
#define COL 10
#define DIV 10
int main(){
int matrix1[ROW][COL], matrix2[3][3], kernel[3][3], answerx, answery, x, y;
printf("What is the X coordinates?\n");
scanf("%i", &answerx);
printf("What is the Y coordinates?\n");
scanf("%i", &answery);
// Generate Kernel
for(int r=0;r<3;r++){
for(int c=0;c<3;c++){
kernel[r][c]=rand()%DIV;
}
}
// Generate User Matrix
for(int r=0;r<ROW;r++){
for(int c=0;c<COL;c++){
matrix1[r][c]=rand()%DIV;
}
}
x=answerx-1;
y=answery-1;
// Generate Matrix with Kernel
for(int r=0;r<3;r++){
for(int c=0;c<3;c++){
matrix2[r][c]=matrix1[x][y]*kernel[r][c];
}
}
}
// Print Kernel
printf("\tKernel(Filter)\n");
for(int r=0;r<3;r++){
for(int c=0;c<3;c++){
printf("\t %i", kernel[r][c]);
}
printf("\n");
}
// Print User Matrix
printf("\t User Matrix \n");
for(int r=0;r<ROW;r++){
for(int c=0;c<COL;c++){
printf("\t %i", matrix1[r][c]);
}
printf("\n");
}
// Print Kernel-Matrix
printf("\t Kernel/Matrix \n");
for(int r=0;r<3;r++){
for(int c=0;c<3;c++){
printf("\t %i", matrix2[r][c]);
}
printf("\n");
}
printf("Coordiantes X: %i e Y: %i \n", answerx, answery);
}
我真的是编程新手,这是我毕业的练习,但我无法理解,如何用r和c以及x和y来控制内核,我确实需要答案< / p>
答案 0 :(得分:1)
带有内核的2D数组的离散convolution导致另一个2D数组:
out[x, y] = sum_j sum_k kernel[j, k] * in[x - j, y - k].
其中,j和k的总和超过内核的非零占用面积。这是您要实现的计算。
请注意,in[x - j, y - k]
有时可能指向未定义输入数组的边界元素。因此,通常需要使用boundary handling方法,例如假设边界元素为零或输入的某些外推法。
研究信号处理库如何处理卷积可能会有所帮助。它们如何表示输入和输出,边界选项等: