#include <stdio.h>
#include <stdlib.h>
// 定义矩阵大小
#define M 5 // A矩阵的行数
#define N 5 // A矩阵的列数
#define K 7 // B矩阵的大小
void conv2_same(double A[M][N], double B[K][K], double C[M][N]) {
int i, j, m, n, iB, jB;
int kHalf = K / 2;
// 遍历A矩阵中的每个元素
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
double sum = 0.0;
// 遍历B矩阵中的每个元素
for (m = 0; m < K; m++) {
for (n = 0; n < K; n++) {
// 计算B矩阵的索引
iB = i + m - kHalf;
jB = j + n - kHalf;
// 检查索引是否在A矩阵的范围内
if (iB >= 0 && iB < M && jB >= 0 && jB < N) {
sum += A[iB][jB] * B[m][n];
}
}
}
// 将卷积结果存储在C矩阵中
C[i][j] = sum;
}
}
}
int main() {
double A[M][N] = {
{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}
};
double B[K][K] = {
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1}
};
double C[M][N];
conv2_same(A, B, C);
// 打印结果
printf("卷积结果:\n");
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
printf("%lf ", C[i][j]);
}
printf("\n");
}
return 0;
}
这个代码将实现二维卷积,并返回与输入矩阵A大小相同的卷积结果。需要注意的是,A和B的大小在定义时已经固定,但你可以根据需要修改大小。
确保结果和matlab一致
ChatGPT
为了确保C语言实现的卷积结果与MATLAB一致,需要仔细处理边界条件。以下是改进的C代码,确保与MATLAB的conv2(A, B, 'same')函数一致:
c
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义矩阵大小
#define M 5 // A矩阵的行数
#define N 5 // A矩阵的列数
#define K 7 // B矩阵的大小
void conv2_same(double A[M][N], double B[K][K], double C[M][N]) {
int i, j, m, n;
int kHalf = K / 2;
// 初始化C矩阵为0
memset(C, 0, sizeof(double) * M * N);
// 遍历A矩阵中的每个元素
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
double sum = 0.0;
// 遍历B矩阵中的每个元素
for (m = -kHalf; m <= kHalf; m++) {
for (n = -kHalf; n <= kHalf; n++) {
int aRow = i + m;
int aCol = j + n;
int bRow = m + kHalf;
int bCol = n + kHalf;
// 检查索引是否在A矩阵的范围内
if (aRow >= 0 && aRow < M && aCol >= 0 && aCol < N) {
sum += A[aRow][aCol] * B[bRow][bCol];
}
}
}
// 将卷积结果存储在C矩阵中
C[i][j] = sum;
}
}
}
int main() {
double A[M][N] = {
{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}
};
double B[K][K] = {
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1}
};
double C[M][N];
conv2_same(A, B, C);
// 打印结果
printf("卷积结果:\n");
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
printf("%lf ", C[i][j]);
}
printf("\n");
}
return 0;
}
conv2
最新推荐文章于 2024-09-22 21:22:19 发布