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

C++实现二维矩阵乘法非方阵输入计算结果错误问题求解

问题触发原因
  • 结果数组内存分配硬编码错误:代码固定分配长度为5的int数组,仅能适配2×2方阵的结果存储,非方阵场景下空间大小不匹配,且仅手动初始化前5个元素为0,未初始化的空间会返回随机垃圾值。
  • 结果数组索引计算逻辑错误:访问结果数组时使用i * col1 + j作为索引,其中col1是第一个矩阵的列数,但结果矩阵的列数为col2,正确索引计算应为i * col2 + j,索引错位导致计算结果存储位置错误。
  • 第二个矩阵元素读取索引错误:访问list2时使用k * col1 + j作为索引,list2的列数为col2而非col1,正确索引计算应为k * col2 + j,取值错误直接导致乘法运算结果异常。
修复方案
  1. 动态分配结果数组,大小为row1 * col2,并统一初始化所有元素为0
  2. 修正结果数组的索引计算逻辑
  3. 修正第二个矩阵的元素读取索引逻辑
  4. 补充内存释放逻辑避免泄漏

修正后的完整代码如下:

#include <iostream>
using namespace std;

void printArray2D(int* list, int row, int col) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cout << list[i * col + j] << " ";
        }
        cout << endl;
    }
}

int* matrixMultiplication(int* list1, int* list2, int row1, int col1, int row2, int col2) {
    if (col1 != row2) {
        cout << "Array sizes don't match";
        return NULL;
    }
    int res_size = row1 * col2;
    int* newList = new int[res_size](); // 圆括号表示默认初始化为0
    for (int i = 0; i < row1; i++) {
        for (int j = 0; j < col2; j++) {
            for (int k = 0; k < col1; k++) {
                // 修正两个索引错误
                newList[i * col2 + j] += list1[i * col1 + k] * list2[k * col2 + j];
            }
        }
    }
    return newList;
}

int main()
{
    int list1[2][1] = {1,2};
    int list2[1][2] = {1,2};
    
    int row1 = sizeof(list1) / sizeof(list1[0]);
    int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
    int row2 = sizeof(list2) / sizeof(list2[0]);
    int col2 = sizeof(list2[0]) / sizeof(list2[0][0]);
    
    int* result = matrixMultiplication((int*)list1, (int*)list2, row1, col1, row2, col2);
    if (result != NULL) {
        printArray2D(result, row1, col2);
        delete[] result; // 释放动态分配的内存
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者user6210457

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:01