已安装 Rcpp,但来自复杂代码段的编译错误
Posted
技术标签:
【中文标题】已安装 Rcpp,但来自复杂代码段的编译错误【英文标题】:Rcpp installed but compilation error from complex code snippet 【发布时间】:2022-01-07 16:25:13 【问题描述】:我已经在 RStudio 中安装了 Rcpp 和 RccpEigen。我也能够成功运行 Rcpp 代码(未使用 RccpEigen)。但是,以下同时使用两者的代码似乎不起作用。
这里是代码-
library(Rcpp)
library(RcppEigen)
sourceCpp(code = '
#include <Rcpp.h>
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
using namespace Rcpp;
using namespace Eigen;
using namespace RcppEigen;
// [[Rcpp::export]]
List luEigen(MatrixXd M)
FullPivLU<MatrixXd> luE(M);
return List::create(Named("L_matrix") = luE.matrixLU().triangularView<Upper>());
')
A <- 0.8 + 0.2 * diag(100)
(luEigen(A))
这段代码给出了一个很长的错误,所以这里是关键的错误行 -
/Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp/generated/Vector__create.h:71:10: note: in instantiation of function template specialization 'Rcpp::Vector<19, PreserveStorage>::create__dispatch<Rcpp::traits::named_object<Eigen::TriangularView<const Eigen::Matrix<double, -1, -1, 0>, 2>>>' requested here
return create__dispatch( typename traits::integral_constant<bool,
^
file16bbd8305f5c.cpp:11:18: note: in instantiation of function template specialization 'Rcpp::Vector<19, PreserveStorage>::create<Rcpp::traits::named_object<Eigen::TriangularView<const Eigen::Matrix<double, -1, -1, 0>, 2>>>' requested here
return List::create(Named("L_matrix") = luE.matrixLU().triangularView<Upper>());
^
18 warnings and 1 error generated.
make: *** [file16bbd8305f5c.o] Error 1
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/4.1/Resources/library/RcppEigen/include" -I"/private/var/folders/_3/wdql3v5d4vggzffw3xdcr3p80000gn/T/RtmpQioi38/sourceCpp-x86_64-apple-darwin17.0-1.0.7" -I/usr/local/include -fPIC -Wall -g -O2 -c file16bbd8305f5c.cpp -o file16bbd8305f5c.o
鉴于安装了 Rcpp 和 RccpEigen 并且不同的 Rccp 代码确实可以工作,那么该代码中可能导致错误的原因是什么?
【问题讨论】:
也许尝试更简单的特征码?您在那里有一个复杂的分解,您希望将其传递给一个列表元素,然后是一个列表,然后(最后)是一个 R 可以采用的SEXP
。有时......你需要分解它。俗话说:“先走后跑”。这是我在 Rcpp 文档中写的第一次尝试Rcpp::evalCpp("2 + 2")
。
我允许自己编辑您的帖子标题:这与“执行”无关。
非常感谢@DirkEddelbuettel 的建议和回复!让我试一试
@DirkEddelbuettel 以某种方式完成了这项工作!非常感谢。我已经为可能遇到同样问题的任何人提供了这个问题的答案
没有“不知何故”。这就是它的工作原理:当你将六步合二为一时,它可能会失败。所以一一分解……
【参考方案1】:
在@Dirk 的一个非常有用的建议下,我简化了分解并成功了。仍然不确定为什么更复杂的构造会引发错误,但最重要的是简化可以完成工作。这是我修改后的代码 -
library(Rcpp)
library(RcppEigen)
sourceCpp(code = '
#include <Rcpp.h>
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
using namespace Rcpp;
using namespace Eigen;
using namespace RcppEigen;
// [[Rcpp::export]]
List luEigen(MatrixXd M) // here I name our function
FullPivLU<MatrixXd> luE(M); // here I perform the decomposition
MatrixXd upper = luE.matrixLU().triangularView<Upper>(); // this creates the upper matrix
MatrixXd lower = luE.matrixLU().triangularView<StrictlyLower>(); // this creates the lower matrix
return List::create(Named("U_matrix") = upper, Named("L_matrix") = lower); // this makes the list of the 2 matrices
')
A <- 0.8 + 0.2 * diag(100)
(luEigen(A))
您可以通过只进行一次分解并从中调用上三角矩阵和下三角矩阵来进一步加快速度,就像这样 -
FullPivLU<MatrixXd> luE(M); // here I perform the decomposition
MatrixXd decomp = luE.matrixLU();
MatrixXd upper = decomp.triangularView<Upper>(); // this creates the upper matrix
MatrixXd lower = decomp.triangularView<StrictlyLower>(); // this creates the lower matrix
【讨论】:
以上是关于已安装 Rcpp,但来自复杂代码段的编译错误的主要内容,如果未能解决你的问题,请参考以下文章
OpenMP 在 SEIR 模型的 Rcpp 代码中生成段错误
Visual Studio 编译错误 - 计算机中缺少 nuget 包,但 nuget restore 说所有包都已安装?