如果你看矩阵元素的大小,你会注意到svd.matrixU()
是18x18,svd.singularValues()
是18,svd.matrixV()
是27x27。当你写svd.matrixU() * svd.singularValues().asDiagonal()
时,结果是一个18×18的矩阵,它不能乘以svd.matrixV()
。您已经定义了禁用边界检查的-DNDEBUG。你看到的随机数是分配前的内存。你可以解决这个得到使用下面的代码:
MatrixXd res(C.rows(), C.cols());
res.setZero();
res.topLeftCorner(C.rows(), C.rows()) = (svd.matrixU() * svd.singularValues().asDiagonal());
MatrixXd Cp = res * svd.matrixV().transpose();
MatrixXd diff = Cp - C;
cout << "diff:\n" << diff.array().abs().sum();
由于ggael指出的那样,你可以问,只有薄矩阵来计算,这将是这样的:
#include <Eigen/Core>
#include <Eigen/SVD>
#include <iostream>
using namespace Eigen;
using std::cout;
int main()
{
MatrixXd C;
C.setRandom(27,18);
JacobiSVD<MatrixXd> svd(C, ComputeThinU | ComputeThinV);
MatrixXd Cp = svd.matrixU() * svd.singularValues().asDiagonal() * svd.matrixV().transpose();
MatrixXd diff = Cp - C;
cout << "diff:\n" << diff.array().abs().sum() << "\n";
return 0;
}
你能后的值'C'? –
https://www.dropbox.com/s/mubch99z6jo9k0a/c?dl=0 – mkuse
在偶尔运行时,我也看到'nan' – mkuse