【问题标题】:How do I fix this problem with multiplying two matrices?如何通过将两个矩阵相乘来解决这个问题?
【发布时间】:2021-04-11 13:54:09
【问题描述】:

我试图将两个矩阵相乘,这两个矩阵是从一个文本文件中读取的,这就是为什么矩阵的值没有被初始化的原因。这是代码:

int main() {
    ...
    else if (multiplication == true){
        if (columnsA == rowsB && rowsA == columnsB){
            for(int i = 0; i < rowsA; i++){
                for(int j = 0; j < columnsB + 1; j++){
                    for(int k = 0; k < columnsA; k++){
                        C[i][j] = C[i][j] + A[i][k] * B[k][j];
                    }
                } 
            }
        }
        else{
            printf("\nError: The number of columns in Matrix A must be equal to the number of rows in Matrix B for multiplication");
            return 1;
        }
    }
    ...

return 0;
}

A 是第一个矩阵,B 是第二个矩阵,C 是输出。 rowsA 是矩阵 A 中的行数,B 是矩阵 matrixB 中的列数。

该代码适用于输出矩阵中的第一个数字,但最后一个数字始终是一个非常长的随机数。

例如,输入将是具有以下值的2x2 矩阵: 第 1 行:3 1 第 2 行:5 2

另一个2x2矩阵具有以下值

row 1: 4 1
row 2: 2 6

输出结果为

row 1: 14 9
row 2: 24 -374793898(or some other long, random number)

前三个数字是正确的(我检查过)但最后一个永远不正确。

【问题讨论】:

  • 代码似乎正确。在我看来,在将它们相乘之前,您没有正确填充其中一个矩阵(A、B 和/或 C)
  • 注意,测试rowsA == columsB是没用的。矩阵C 不一定是正方形

标签: c matrix multidimensional-array matrix-multiplication


【解决方案1】:
   else if (multiplication == true){
        if (columnsA == rowsB && rowsA == columnsB){
            for(int i = 0; i < rowsA; i++){
                for(int j = 0; j < columnsB + 1; j++){
                    for(int k = 0; k < columnsA; k++){
                        C[i][j] = C[i][j] + A[i][k] * B[k][j];
                    }
                } 
            }
        }

您的乘法代码从矩阵CAB 中读取值。矩阵 A 和 B 是从文件中读取的,但是您忘记用零初始化矩阵 C int C[5][5] = {0};)。否则,矩阵 C 将包含 随机 值。而这些随机值将在C[i][j] = C[i][j] + A[i][k] * B[k][j]; 操作期间添加到矩阵AB

此外,在for(int j = 0; j &lt; columnsB + 1; j++) 中将columnsB + 1 更改为columnsB。否则,您将超出矩阵CB 的边界,在以下代码中用“^”标记:

 for(int j = 0; j < columnsB + 1; j++)
    for(int k = 0; k < columnsA; k++)
        C[i][j] = C[i][j] + A[i][k] * B[k][j];
                      ^^^                 ^^^

【讨论】:

    【解决方案2】:

    我认为根本原因是这一行

    for(int j = 0; j < columnsB + 1; j++){
    

    +1 让你走出 5x5 矩阵

    另外你确实需要将 C 矩阵初始化为 0。

    【讨论】:

      【解决方案3】:

      我认为你应该这样做,

      用 0 初始化 c[5][5]。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        • 2016-04-16
        相关资源
        最近更新 更多