Eigen 设置分解阈值(公差)特征::JacobiSVD

Eigen 设置分解阈值(公差)特征::JacobiSVD,eigen,eigen3,Eigen,Eigen3,我试着用艾根的雅各比色维做实验。特别是,我试图从奇异值分解重构输入矩阵 对于我的应用程序,此错误太高,我的目标是10^-10-10^-12范围内的错误。我的问题是如何设置分解的阈值 注意:在文档中,我注意到有一种方法setThreshold(),但它明确指出,这并没有为分解设置阈值,而是为与零进行奇异值比较设置阈值 注:我不希望尽可能地买双份。甚至可以使用浮点吗?一个单精度浮点(32位浮点)具有6到9个有效十进制数字,因此不可能要求10^{-10}(假设值约为0.5f)。双精度浮点(64位dou

我试着用艾根的雅各比色维做实验。特别是,我试图从奇异值分解重构输入矩阵

对于我的应用程序,此错误太高,我的目标是10^-10-10^-12范围内的错误。我的问题是如何设置分解的阈值

注意:在文档中,我注意到有一种方法
setThreshold()
,但它明确指出,这并没有为分解设置阈值,而是为与零进行奇异值比较设置阈值


注:我不希望尽可能地买双份。甚至可以使用浮点吗?

一个单精度浮点(32位
浮点
)具有6到9个有效十进制数字,因此不可能要求10^{-10}(假设值约为0.5f)。双精度浮点(64位
double
)具有15-17位有效十进制数字,因此只要值不是10^6,就可以工作

Eigen::MatrixXf m = Eigen::MatrixXf::Random(3,3);
Eigen::JacobiSVD<Eigen::MatrixXf, Eigen::NoQRPreconditioner> svd(m, Eigen::ComputeFullU | Eigen:: ComputeFullV);
Eigen::VectorXf SVec = svd.singularValues();
Eigen::MatrixXf S = Eigen::MatrixXf::Identity(3,3);
S(0,0) = SVec(0);
S(1,1) = SVec(1);
S(2,2) = SVec(2);

Eigen::MatrixXf recon = svd.matrixU() * S * svd.matrixV().transpose();
cout<< "diff : \n"<< m - recon << endl;
diff : 
 9.53674e-07   1.2517e-06 -2.98023e-07
-4.47035e-08   1.3113e-06   8.9407e-07
 5.96046e-07 -9.53674e-07  -7.7486e-07