【问题标题】:2D Matrix Multiplication in C++C++ 中的二维矩阵乘法
【发布时间】:2021-12-26 02:30:31
【问题描述】:

我想编写一个函数,让我们可以对 2 个 2D 矩阵进行乘法运算。此函数具有以下参数作为输入: list1 和 list2 是二维数组。它们作为指针传递给函数。 Row1, col1, row2, col2 是 list1 和 list2 的大小的 int 值。

当我有输入的方阵时,我会得到正确的结果。例如; list1[2][2] = {1,2,3,4} 和 list2[2][2] = {1,2,3,4} 给出结果 {7,10,15,22}。

当我不使用方阵时,我不会得到正确的结果。例如; list1[2][1] = {1,2} 和 list2[1][2] = {1,2} 给出的结果 {1,4,4,0} 是错误的,而 list1[2][1] = {1,2} 和 list2[1][2] = {1,2} 给出一个垃圾值而不是一个标量。

编辑:修复了返回指针问题,但我仍然没有得到正确的结果

#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;
    }
    else {
        int* newList = new int[5];
        newList[0] = 0;
        newList[1] = 0;
        newList[2] = 0;
        newList[3] = 0;
        newList[4] = 0;
        for (int i = 0; i < row1; i++) {
            for (int j = 0; j < col2; j++) {
                for (int k = 0; k < col1; k++) {
                    newList[i * col1 + j] = newList[i * col1 + j] + list1[i * col1 + k] * list2[k * col1 + 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);

    printArray2D((int*)result, row1, col2);

    return 0;
}

【问题讨论】:

  • 你返回指向在return语句后被销毁的局部变量的指针。编译器应该警告你这个问题,你不应该忽略编译器警告。
  • 我把newList的返回值改成了result,现在和函数中的局部变量不一样了
  • 您似乎必须投资任何一本好的 C++ 书籍。您没有更改返回值,而是重命名了目标变量名称。
  • 这个list2[k * col1 + j]不应该是list2[k * col2 + j]吗?
  • 还有,这个newList[i * col1 + j] = newList[i * col1 + j]不应该是newList[i * col2 + j] = newList[i * col2 + j]

标签: c++ function multidimensional-array


【解决方案1】:

我不会在一个函数中混入两个完全不同的问题,一个内存分配和一个矩阵-矩阵乘法!

我会这样C = A * B

bool matrixMultiplication(int* C, int* A, int * B, int rowA, int colA, int rowB, int colB) {

    if (colA != rowB) return true;

    for (int i = 0; i < rowA; i++)
        for (int j = 0; j < colB; j++)
            for (int k = 0; k < colA; k++)
                C[i*colB + j] += A[i*colA + k] * B[k*colB + j];

    return false;
}

所以,在主脚本中有这样的内容:

bool error = matrixMultiplication( /* parameters */ );
if ( error ) {
    std::cout << "invalid matrix dimensions" << std::endl;
    return 0;
}

以这种方式隐藏例程下的内存分配通常是一个非常糟糕的主意!通过关注点分离更好地设计代码。该例程的范围是将两个矩阵AB相乘,并将结果存储到C

注意:

  1. 确保C 下的所有值都提前设置为零!

  2. 我们对这条线的选择存在分歧:C[i*colB + j] += A[i*colA + k] * B[k*colB + j];

【讨论】: