You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 04:27:02