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,取值错误直接导致乘法运算结果异常。
修复方案
- 动态分配结果数组,大小为
row1 * col2,并统一初始化所有元素为0 - 修正结果数组的索引计算逻辑
- 修正第二个矩阵的元素读取索引逻辑
- 补充内存释放逻辑避免泄漏
修正后的完整代码如下:
#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
相关产品推荐
相关产品推荐

