【问题标题】:Multiplying 3x3 matrices in C++ [closed]在 C++ 中乘以 3x3 矩阵 [关闭]
【发布时间】:2016-12-07 12:55:38
【问题描述】:

我正在开发一个将两个 3X3 矩阵相乘的程序。我遇到了一些问题,但我无法弄清楚这些问题。任何帮助将不胜感激:D

#include <iostream>

using namespace std;

int main(){

int matrix1[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int matrix2[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int results[3][3];
int product = 0;
int i;
int j;

for (i = 1; i <= 3; i++){
    for (j = 1; j <= 3; j++){
        product += matrix1[i][j] * matrix2[j][i];
        cout << product << endl;
    }
    results[i][j] = product;
    product = 0;
}

cout << endl << "Output Matrix: " << endl;

for (int i = 1; i < 4; i++){
    for (int j = 1; j < 4; j++){
        cout << results[i][j];
    }
    cout << endl;
}


system("pause");
return 0;
}

这是我从中得到的结果:

25
73
-1717986851
48
129
-858993331
-1867771963
1566576709
1595991863

Output Matrix:
-858993460-858993460-858993460
-1717986851-858993460-858993460
-85899333112
Press any key to continue . . .

再次提前感谢! :D

【问题讨论】:

  • 如果您从未使用 new 创建过这些,为什么还要使用 delete[] matrix1; aso?
  • results[i][j] = product; 应该在内部循环体内。
  • 首先,您似乎忘记了数组索引从零变为大小减一。
  • 尝试在你最喜欢的IDE中打开“watches”窗口使用调试工具,它对于处理这类问题非常好。如果您感到震惊,请返回 stackoverflow 并创建一个问题来描述问题、期望的行为以及您尝试实现的目标,并提供 MCVE。
  • @TripleEEE 因为 C++ 没有对数组进行边界检查。越界会导致未定义的行为,这可能导致崩溃,但编译器或运行时环境不会捕获。

标签: c++ visual-studio math matrix


【解决方案1】:

因此,您不需要在开头使用 int i, j; 行。如果你没有它们,编译器会正确地告诉你results[i][j] = product; 是在错误的地方。数组的第一个值也不是A[1],而是A[0]。对于矩阵乘法,我建议您阅读this
因此解决方案应如下所示:

int matrix1[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int matrix2[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int results[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) {
        for (int u = 0; u < 3; u++)
            results[i][j] += matrix1[i][u] * matrix2[u][j];
    }

cout << endl << "Output Matrix: " << endl;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        cout << results[i][j] << ".";
    }
    cout << endl;
}

【讨论】:

  • 出于某种原因,我完全忘记了从 0 开始的事情。非常感谢
【解决方案2】:

您的矩阵乘法代码错误。看看这个字面实现:

for (i = 0; i < 3; i++){
    for (j = 0; j < 3; j++){
         product = 0; 
         for (k = 0; k < 3; k++){
            product += matrix1[i][k] * matrix2[k][j];
         }
         matrix3[i][j] = product;

    }
}  

【讨论】:

    【解决方案3】:

    矩阵乘法的实现方式如下(对于 2 N x N 矩阵):

    for i = 1..N
       for j = 1..N
         result[i][j] = 0.
         for k = 1..N
           result[i][j] += matrix1[i][k] * matrix2[j][k] // "row times column"
         end for
       end for
    end for 
    

    这将返回产品result = matrix1 * matrix2。在 C++ 中,您必须使用例如

    for (int i = 0; i < N; i++)
    

    循环。您必须以 0 开头并以 N-1 结尾(这就是您使用 &lt; 而不是 &lt;= 的原因)。在您的示例中设置int N = 3

    您只能为每个new 使用delete。所以如果不动态分配矩阵,就不需要删除数组。

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多