已知用一个二维数组表示需要被卷积的矩阵,一个3*3的二维数组卷积核,求该矩阵的卷积。用C++代码实现这一过程
时间: 2024-03-27 13:36:59 浏览: 49
好的,以下是C++代码实现该过程:
```c++
#include <iostream>
using namespace std;
// 定义矩阵大小
#define ROW 5
#define COL 5
// 定义卷积核大小
#define KERNEL_SIZE 3
// 定义卷积核
int kernel[KERNEL_SIZE][KERNEL_SIZE] = {
{1, 1, 1},
{1, 1, 1},
{1, 1, 1}
};
// 定义需要被卷积的矩阵
int matrix[ROW][COL] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25}
};
// 定义卷积后的矩阵
int conv[ROW][COL] = {0};
int main()
{
// 遍历需要被卷积的矩阵
for(int i = 1; i < ROW - 1; i++) {
for(int j = 1; j < COL - 1; j++) {
// 取出3*3的子矩阵
int sub_matrix[KERNEL_SIZE][KERNEL_SIZE] = {0};
for(int k = i - 1, x = 0; k <= i + 1; k++, x++) {
for(int l = j - 1, y = 0; l <= j + 1; l++, y++) {
sub_matrix[x][y] = matrix[k][l];
}
}
// 将子矩阵与卷积核进行逐元素相乘,然后将结果相加
int sum = 0;
for(int x = 0; x < KERNEL_SIZE; x++) {
for(int y = 0; y < KERNEL_SIZE; y++) {
sum += sub_matrix[x][y] * kernel[x][y];
}
}
// 将结果赋值给卷积后的矩阵的对应位置
conv[i][j] = sum;
}
}
// 输出卷积后的矩阵
for(int i = 0; i < ROW; i++) {
for(int j = 0; j < COL; j++) {
cout << conv[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
在这个代码中,我们首先定义了需要被卷积的矩阵、卷积核和卷积后的矩阵。然后,我们遍历需要被卷积的矩阵,对于每个像素点,以该点为中心,取出3*3的子矩阵,并将子矩阵与卷积核进行逐元素相乘,然后将结果相加,得到一个数值,将其赋值给卷积后的矩阵的对应位置。最后输出卷积后的矩阵。
阅读全文