请在下一期中启发我。我试图乘以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;
}
答案 0 :(得分:4)
创建数组的逻辑是正确的,但输出错误。
矩阵结果是二维的,但你写的是三个维度。
输出必须等到过程完成。
答案 1 :(得分: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";
}
事实上,我认为这是一种(通常)有用的技术:单独处理与显示。没错,有时为了提高效率,你应该同时做这些,但更多时候,简单的时间对你和你的客户来说都会更加珍贵。 )
答案 2 :(得分: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";
}