Eigen::JacobiSVD编译报错qr_preconditioner_impl无run成员
问题根因
你传参位置错了:ComputeThinU | ComputeThinV是SVD的计算控制标志,应该传给JacobiSVD构造函数的入参,而不是类的第二个模板参数。JacobiSVD的第二个模板参数是QR预处理器类型,合法取值只有四个内置枚举值:
ColPivHouseholderQRPreconditioner(默认值,绝大多数场景用这个即可)FullPivHouseholderQRPreconditionerHouseholderQRPreconditionerNoQRPreconditioner
你把计算标志塞到模板参数里之后,编译器把ComputeThinU | ComputeThinV的按位或结果40当成了预处理器类型,内部针对合法预处理器值特化的qr_preconditioner_impl类没有对应40的实现,自然找不到run方法,就报了你看到的编译错误。
修复方案
把计算标志从模板参数位置移到构造函数参数位即可,修正后的可运行代码:
#include <Eigen/Core> #include <Eigen/SVD> #include <iostream> using namespace std; using namespace Eigen; int main () { MatrixXf m = MatrixXf::Random(3,2); cout << "Here is the matrix m:" << endl << m << endl; // 模板参数只传矩阵类型,计算标志作为构造函数第二个参数传入 JacobiSVD<MatrixXf> svd(m, ComputeThinU | ComputeThinV); cout << "Its singular values are:" << endl << svd.singularValues() << endl; cout << "Its left singular vectors are the columns of the thin U matrix:" << endl << svd.matrixU() << endl; cout << "Its right singular vectors are the columns of the thin V matrix:" << endl << svd.matrixV() << endl; Vector3f rhs(1, 0, 0); cout << "Now consider this rhs vector:" << endl << rhs << endl; cout << "A least-squares solution of m*x = rhs is:" << endl << svd.solve(rhs) << endl; return 0; }
补充说明
如果有特殊需求要自定义QR预处理器类型,可以显式指定第二个模板参数,计算标志仍然放在构造函数入参位置,比如要跳过QR预处理直接做Jacobi分解:
JacobiSVD<MatrixXf, NoQRPreconditioner> svd(m, ComputeThinU | ComputeThinV);
Eigen是纯头文件库,编译时不需要额外链接库,g++下正常编译即可:
g++ demo.cpp -o svd_test -std=c++11
内容的提问来源于stack exchange,提问作者Some_Guy
相关产品推荐
相关产品推荐

