You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:01:19