C++ 中的二维矩阵乘法

2D Matrix Multiplication in C++

我想编写一个函数,使我们能够对 2 个二维矩阵进行乘法运算。此函数具有以下参数作为输入: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} and 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;
}

我不会在一个函数中混合两种完全不同的事情,内存分配和矩阵-矩阵乘法!

我会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];