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

配列を作成するロジックは正しいですが、出力が間違っています。

行列の結果は 2 次元ですが、3 次元を書いています。

出力は、プロセスが完了するまで待機する必要があります。

于 2012-08-28T15:40:41.687 に答える
1

まだ完了していないときに、結果のマトリックスを出力し始めています。Mtx_Res実際、 j = 0と1の場合、それぞれ2回の各セルを出力します(したがって、あなたが言ったように、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 に答える