c++ - 如何检查两个矩阵是否相同?
问题描述
想法是将两个矩阵相乘。并使用 Eigen 进行相同的乘法运算,然后检查结果是否相同。
在下面做N = 2
返回same thing
但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()
.
正如评论中所讨论的,可能总会有这样的比较可能无法可靠工作的情况。但是使用 Eigen 的函数,例如isApprox()
orisMuchSmallerThan()
比任何简单的手工解决方案都更有效。
推荐阅读
- ios - 在 iPad 中显示 ActionSheet
- ffmpeg - 没有 RTSP 的 TCP 上的 RTP(用于在 FFmpeg 中接收)
- windows - 用于检查 Windows 更新的 VB 代码说服务器不可用
- oracle - 异常与 raise_application_error
- javascript - 使用Javascript在图像上绘制画布线不会影响整个区域
- objective-c - 如何在 Objective-C 中测试标准输入功能?
- node.js - 我尝试使用 nodejs 和 mongodb 进行 crud 操作。所有 crud 操作都工作正常。但是 get 方法只显示一个数据而不显示所有数据
- mysql - 如何运行包含大量数据的查询?
- r - 从服务器端调用对数据表应用客户端过滤器
- latex - 算法前文字跳起来(algorithm2e)