【问题标题】:Ways to check the result of multiplying matrices?检查矩阵相乘结果的方法?
【发布时间】:2017-03-21 10:12:27
【问题描述】:

我有一个简单的 C++ 程序,可以乘以:矩阵 * 矩阵:

#include <iostream>

using namespace std;

int main()
{
    int n, m, r, i, j, k, si;

    cout << "Dimension 1: ";
    cin >> n;
    cout << "Dimension 2: ";
    cin >> m;
    cout << "Dimension 3: ";
    cin >> r;


    int * A = new int[n * m];
    int * B = new int[m * r];
    int * C = new int[n * r];

    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++) cin >> A[i * m + j];

    for (i = 0; i < m; i++)
        for (j = 0; j < r; j++) cin >> B[i * r + j];

    for (i = 0; i < n; i++)
        for (j = 0; j < r; j++)
        {
            si = 0;
            for (k = 0; k < m; k++)
                si += A[i * m + k] * B[k * r + j];
            C[i * r + j] = si;
        }

    cout << endl;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < r; j++) cout << C[i * r + j] << " ";
        cout << endl;
    }

    getchar();
    getchar();
}

如果矩阵真的很大(例如 1000x1000),有哪些方法可以检查结果? (我的意思是使用编程语言,而不是数学)

【问题讨论】:

  • 为什么不在小矩阵上检查代码的正确性,比如 3x3 或 4x4?如果小矩阵工作正常(并涵盖所有边缘情况),您只需要检查大情况下的溢出和性能。
  • “矩阵测试数据”的大量 Google 结果
  • 你怎么知道你的检查程序是正确的?
  • @alexeykuzmin0 我的主要目标不是找出我的结果是否正确,而是找到一种算法/方法来以另一种方式计算结果,换句话说:实现一个检查第一种方法的解决方案.

标签: c++ math matrix matrix-multiplication


【解决方案1】:

我假设您的意思是检查正确的实施。

有几种方法可以做到这一点:

1.通过归纳推理证明正确性(如果它适用于 n = 1 和 n = 2 等,它也适用于 n = 1000)

2. 实现一个不同的算法,实现相同的结果,并比较不同输入大小的两个结果。

如果你真的想确保你的算法适用于一组定义的输入变量,你也可以写一个formal proof(到那时你已经很确定它是正确的了。)

【讨论】:

  • 好点。实际上,我正在尝试实施一个检查第一种方法的解决方案。你能提出你在第 2 点中提到的任何算法吗?
  • 你可以尝试实现这个:en.wikipedia.org/wiki/Strassen_algorithm。它也比标准方法快得多。
【解决方案2】:

您可以使用其他成熟的软件生成测试数据。试试 MATLAB matrix generators

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多