Eigen库SparseLU的colsPermutation与rowsPermutation提取错误求助
解决Eigen SparseLU提取置换矩阵时的'eval'成员不存在错误
修正后的代码
// [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::depends(RcppEigen)]] #include <RcppArmadillo.h> #include <RcppEigen.h> #include <Rcpp.h> #include <Rcpp/Benchmark/Timer.h> using namespace arma; // [[Rcpp::export]] Rcpp::List sparseLUSolverFirstTime(Eigen::SparseMatrix<double> xx, Eigen::VectorXd b){ Eigen::SparseLU<Eigen::SparseMatrix<double>> solver; solver.compute(xx); // 使用具体的PermutationMatrix类型接收置换矩阵 const Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> P_C = solver.colsPermutation(); const Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> P_R = solver.rowsPermutation(); Eigen::VectorXd x = solver.solve(b); //const double det = solver.logAbsDeterminant(); return Rcpp::List::create(Rcpp::Named("solution") = x, Rcpp::Named("col_perm") = P_C, Rcpp::Named("row_perm") = P_R); }
错误原因与解释
- 原代码使用
Eigen::PermutationBase作为变量类型,这是抽象基类,无法直接存储colsPermutation()/rowsPermutation()的返回值。Eigen的这类方法返回的是表达式模板对象,必须赋值给具体的Eigen::PermutationMatrix实例,才能被Rcpp的Eigen桥接机制正确处理。 - 报错提示的
eval方法不存在,是因为Rcpp尝试转换抽象基类对象时调用了该类型不支持的方法。改用具体的PermutationMatrix类型后,RcppEigen可以正常完成类型转换。
替代写法
也可以用auto自动推导变量类型,效果完全一致:
auto P_C = solver.colsPermutation(); auto P_R = solver.rowsPermutation();
内容的提问来源于stack exchange,提问作者FredrikAa
相关产品推荐
相关产品推荐

