【发布时间】:2013-12-06 23:42:01
【问题描述】:
编辑:从下面 Dirk 的回答中得到一些线索,我解决了这个问题,现在问题正文中的解决方案。
我确信这必须记录在某处,但我的谷歌技能让我失望。
我正在开发一个我认为不需要的 Rcpp 包
依赖于 Eigen,所以我非常广泛地使用了NumericVector/Matrix。
但是,我现在需要一个 Cholesky decomp/solve:我知道该怎么做
使用 RcppEigen 但我需要VectorXd/MatrixXd's。假设我有 P.S.D.
NumericMatrix, A 和 NumericVector, b。我尝试了以下各种变化:
Rcpp::NumericVector b(bb);
Rcpp::NumericMatrix A(AA);
Eigen::Map<Eigen::MatrixXd> A_eigen = as<Eigen::Map<Eigen::MatrixXd> >(A);
Eigen::Map<Eigen::VectorXd> b_eigen = as<Eigen::Map<Eigen::VectorXd> >(b);
Eigen::LLT<Eigen::MatrixXd> llt(A_eigen);
Eigen::VectorXd x = llt.solve(b_eigen);
Rcpp::NumericVector xx(wrap(x));
return xx;
然后可以使用inline 包编译它(这里用codeString 表示),如下所示:
f = cxxfunction(signature(AA="matrix",bb="numeric"),codeString,plugin="RcppEigen")
我知道我可以直接从 SEXP 实例中获取 Eigen::MatrixXd/VectorXd(例如使用 Eigen::Map),但在我的使用中我需要从 NumericMatrix/Vector 实例中获取这些。
我的 A 会很小,所以我不会太小 担心是否会创建完整副本。如果有人能提供一个笨重的 解决方案,这将是一个很好的解决方案,一个优雅的解决方案将是 太好了!
在此先感谢您,也感谢您在 Rcpp(Eigen) 上所做的所有出色工作,
大卫
【问题讨论】:
-
您能否提供一个完整的可重现示例。并且可能显示你得到的编译器错误。
-
嗨罗曼 - 感谢您的回复。希望我添加的内容有所帮助。