c++ - 如何检查两个矩阵是否相同?

标签 c++ c++11 matrix c++14 eigen

想法是将两个矩阵相乘。并使用 Eigen 进行相同的乘法运算,然后检查结果是否相同。

在下面,N = 2 返回相同的东西,但是 N = 1000 返回NOT same thing。为什么?

#include <cstdlib>
#include <iostream>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

const int N = 1000;

void mult_matrix(double x[N][N], double y[N][N], double z[N][N]) {
    int rows = N;
    int cols = N;
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++)
            for (int k = 0; k < cols; k++)
                z[i][j] += x[i][k] * y[k][j];
}

void check(double *x, double *y, double *z) {

    Matrix<double, Dynamic, Dynamic, RowMajor> m = 
            Matrix<double, Dynamic, Dynamic, RowMajor>::Map(x, N, N) * 
            Matrix<double, Dynamic, Dynamic, RowMajor>::Map(y, N, N);

    cout << m(0, 0) << endl;
    cout << Matrix<double, Dynamic, Dynamic, RowMajor>::Map(z, N, N)(0, 0) << endl;

    if (m == Matrix<double, Dynamic, Dynamic, RowMajor>::Map(z, N, N))
        cout << "same thing" << endl;
    else
        cout << "NOT same thing" << endl;
}

int main() {
    double *a = (double*)malloc(N*N*sizeof(double));
    double *b = (double*)malloc(N*N*sizeof(double));
    double *c = (double*)malloc(N*N*sizeof(double));

    Matrix<double, Dynamic, Dynamic, RowMajor>::Map(a, N, N).setRandom();
    Matrix<double, Dynamic, Dynamic, RowMajor>::Map(b, N, N).setRandom();
    Matrix<double, Dynamic, Dynamic, RowMajor>::Map(c, N, N).setZero();

    mult_matrix((double (*)[N])a, (double (*)[N])b, (double (*)[N])c);
    check(a, b, c);
}

最佳答案

Eigen 提供成员函数isApprox()可用于检查两个矩阵是否在数值精度范围内相等。

在您的代码中,可以通过将 == 运算符替换为 isApprox() 来简单地实现这样的比较,如下所示:

if (m.isApprox(Matrix<double, Dynamic, Dynamic, RowMajor>::Map(z, N, N)))
  cout << "same thing" << endl;
else
  cout << "NOT same thing" << endl;

所需的精度可以作为可选的第二个参数传递给 isApprox()

正如评论中所讨论的,可能总会存在这样的比较可能无法可靠地工作的情况。但是使用 isApprox()isMuchSmallerThan() 等 Eigen 函数比任何简单的手工解决方案都更有效。

关于c++ - 如何检查两个矩阵是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781723/

相关文章:

c++ - 通用类型演绎斯科特迈耶斯

c++ - 每线程单例使用 thread_local 存储

c++ - 在 opencv 中组合 Scharr 导数

c++ - Qt3d:应用 Qt3DRender::QLayerFilter 时显示的工件

c++ - 变量的初始化列表

python - 将多维数组中的选定值追加到新数组

algorithm - matlab将邻接矩阵转换为邻接表

Matlab:像数据库一样访问矩阵

c++ - 如何避免科学记数法而显示完整数字?

c++ - 如何在 qt4(信号/插槽)中监控 QProcess finished()