C语言使用指针实现矩阵乘法的逻辑设计与现有代码适配问题
适配现有代码的矩阵乘法实现
核心逻辑对齐
你现有代码所有矩阵都是一维连续内存按行优先存储,元素访问规则为矩阵首指针[行号 * 矩阵总列数 + 列号],矩阵乘法函数完全沿用这套规则即可,不需要改动已有的读取、打印、加法功能的代码逻辑。
矩阵乘法的尺寸规则
- 第一个矩阵A:尺寸为 m行 * k列
- 第二个矩阵B:尺寸为 k行 * n列
- 乘积结果矩阵:尺寸为 m行 * n列,和两个源矩阵不需要同尺寸
- 结果矩阵第i行第j列的元素计算方式:取A的第i行全部元素,和B的第j列全部元素,对应位置相乘后累加求和
具体修改步骤
1. 新增乘法函数
完全匹配你现有代码的函数风格,用指针传参,无二级指针:
// 入参说明:a是m行k列矩阵,b是k行n列矩阵,result存储m行n列的乘积结果 void multiplicaMatriz(int *a, int *b, int *result, int m, int k, int n){ int i, j, t; // 结果矩阵初始化置0,避免随机内存值干扰累加 for(i = 0; i < m; i++){ for(j = 0; j < n; j++){ result[i * n + j] = 0; } } // 三重循环实现乘法计算 for(i = 0; i < m; i++){ for(j = 0; j < n; j++){ for(t = 0; t < k; t++){ // 按行优先规则计算元素偏移量 int elem_a = a[i * k + t]; int elem_b = b[t * n + j]; result[i * n + j] += elem_a * elem_b; } } } }
2. 调整main函数的尺寸和内存分配逻辑
原代码默认两个矩阵为同尺寸m行n列,仅适配同尺寸加法,要支持乘法需要分别定义三个矩阵的实际尺寸,动态分配对应内存:
int main(){ int m, k, n, *m1, *m2, *m_mult; // 输入尺寸:A为m行k列,B为k行n列 printf("First matrix lines: "); scanf("%d", &m); printf("First matrix columns (same as second matrix lines): "); scanf("%d", &k); printf("Second matrix columns: "); scanf("%d", &n); // 按实际尺寸分配内存 m1 = (int *)malloc(sizeof(int) * m * k); m2 = (int *)malloc(sizeof(int) * k * n); m_mult = (int *)malloc(sizeof(int) * m * n); // 读取矩阵数据 printf("\nInsert the data of the first matrix:\n"); lerMatriz(m1, m, k); printf("\n\nInsert the data of the second matrix:\n"); lerMatriz(m2, k, n); // 打印已读取的矩阵 printf("\nInserted arrays:\n"); printaMatriz(m1, m, k); printf("\n"); printaMatriz(m2, k, n); // 计算并打印乘法结果 printf("\n\nMultiplication of the Matrices:\n"); multiplicaMatriz(m1, m2, m_mult, m, k, n); printaMatriz(m_mult, m, n); // 释放堆内存,避免泄漏 free(m1); free(m2); free(m_mult); return 0; }
适配说明
- 已有的
lerMatriz、printaMatriz、somaMatriz三个函数完全不需要修改,只要调用时传入对应矩阵的实际行数、列数即可正常工作 - 代码全程使用指针偏移访问内存,完全符合你要求的指针实现矩阵功能的需求
- 三重循环采用i-j-t的顺序,匹配行优先存储的连续内存访问规则,不会出现随机内存跳转导致的性能问题
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

