0

请告诉我下一个问题。我正在尝试将 2 个矩阵相乘,但我的代码中有一些我无法识别的逻辑错误。请帮忙。先感谢您

#include <iostream>
#include <cstdio>

using namespace std;

int main() {
    short int Mtx_A[4][2] = {
        {1,2},
        {3,4},
        {5,6},
        {7,8},
    };

    short int  Mtx_B[2][3] = {
        {5,7,9},
        {11,2,6},
    };

    short int  Mtx_res[4][3] = {0};

    for (short int i = 0;i<4;i++) {         // Mtx_A lines counter
        for (short int j=0;j<2;j++) {       // Mtx_B lines & Mtx_A columns counter
            for (short int k=0;k<3;k++) {   // Mtx_res columns counter
                Mtx_res[i][k] += Mtx_A[i][j] * Mtx_B[j][k];
                cout<< Mtx_res[i][k] <<"*"<<"\t";
            }
            cout<<"o"<<"\n";
        }
    }

    getchar();
    return 0;
}
4

3 回答 3

4

创建数组的逻辑是正确的,但输出是错误的。

矩阵结果是二维的,但您正在编写三个维度。

输出必须等到该过程完成。

于 2012-08-28T15:40:41.687 回答
1

尚未完成时,您将开始输出结果矩阵。实际上,您将输出每个单元Mtx_Res两次,分别为 j = 0 和 1(因此,如您所说,8x3而不是)。4x3

我会在一个单独的循环中完成输出(在 Mtx_Res 构造循环结束之后):

for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 3; j++) {
    cout << Mtx_res[i][j] << "*" << "\t";
  }
  cout << "o" << "\n";
}

事实上,我认为这是一种(通常)有用的技术:将处理与显示分开。诚然,有时您应该为了效率而同时执行这些操作,但更多时候,通过简单赢得的时间对您和您的客户来说都更加宝贵。)

于 2012-08-28T15:41:58.727 回答
1

j在处理完所有索引后,您可以更改输出以发出单元格。k在处理完所有索引后,输出中的下一行继续进行。

            Mtx_res[i][k] += Mtx_A[i][j] * Mtx_B[j][k];
            if (j == 1) {
                cout<< Mtx_res[i][k] <<"*"<<"\t";
                if (k == 2) cout<<"o"<<"\n";
            }
于 2012-08-28T15:45:00.060 回答