联合收割机R、C和x2B+;和Fortran 我试图用C++和RCpp来重新实现R函数,以加快计算速度。在C++实现中,我需要使用fortran函数 MVTDSST < /C> > in < .p> #包括 #包括“mvtnorm.h” 使用名称空间Rcpp; //[[Rcpp::导出]] 数值向量pmvnorm_rcpp(数值向量上限,数值矩阵corr) { 双重错误; 双mvnP=pmvnorm_P(2,上限,更正和错误); 返回mvnP; } /***R pmvnorm_rcpp(c(1.5,1.5),c(0.0)) */
这里,联合收割机R、C和x2B+;和Fortran 我试图用C++和RCpp来重新实现R函数,以加快计算速度。在C++实现中,我需要使用fortran函数 MVTDSST < /C> > in < .p> #包括 #包括“mvtnorm.h” 使用名称空间Rcpp; //[[Rcpp::导出]] 数值向量pmvnorm_rcpp(数值向量上限,数值矩阵corr) { 双重错误; 双mvnP=pmvnorm_P(2,上限,更正和错误); 返回mvnP; } /***R pmvnorm_rcpp(c(1.5,1.5),c(0.0)) */,r,fortran,rcpp,R,Fortran,Rcpp,这里,pmvnorm\u p在mvtnorm.cpp文件中定义 中找到的所有文件都与RcppWrapper.cpp文件一起保存在工作目录中 当我使用RCpp包中的sourceCpp()函数编译我的RcppWrapper.cpp文件时,它给出了以下错误 mvtnorm.o:mvtnorm.cpp:(.text+0x7c):未定义对“mvtdst”的引用 collect2.exe:错误:ld返回了1个退出状态 Rcpp::sourceCpp(“RcppWrapper.cpp”)中出错: 生成共享库时
pmvnorm\u p
在mvtnorm.cpp文件中定义
中找到的所有文件都与RcppWrapper.cpp文件一起保存在工作目录中
当我使用RCpp包中的sourceCpp()
函数编译我的RcppWrapper.cpp文件时,它给出了以下错误
mvtnorm.o:mvtnorm.cpp:(.text+0x7c):未定义对“mvtdst”的引用
collect2.exe:错误:ld返回了1个退出状态
Rcpp::sourceCpp(“RcppWrapper.cpp”)中出错:
生成共享库时出错
有人知道如何解决这个错误吗?< /P> < P> FORTRAN和C++对函数的名称进行了不同的修改。看起来,
mvtdst
是Fotran函数的名称。(对吗?)当从C++调用时,你需要手工处理。因此,不要调用mvtdst
,而是使用尾随下划线调用mvtdst
不幸的是,编译器在混乱中是不一致的,因此这将是不可移植的。(为了使其可移植,您需要进行某种预处理,使其与编译器匹配。)当您在两个源文件中有代码时
调用后端函数mvtnorm.cpp
pmvnorm\u P()
- 另一个提供它的文件
sourceCpp()
仅用于一个文件解决方案(除非您给出链接说明)
最简单的修复:只需在
sourceCpp()
函数时,它失败了。谢谢您的信息。您能提供您尝试过的Rcpp代码吗?我尝试过这个/[[Rcpp::export]]NumericVector pmvnorm_Rcpp(NumericVector upper,NumericMatrix corr){double error;double mvnP=pmvnorm_P(2,upper,corr,&error);return mvnP;}
。在这里,pmvnorm\u P
是在调用fortran函数mvtdst
的中定义的。请将相关代码放入您的问题中。你不断地改变问题的细节,所以你会得到不同的答案,这取决于在写答案时问题的版本。我们还需要知道您是如何编译代码的,以及您是如何链接代码的,因为这些似乎是您的流程中不完整的步骤。另请参见,使用mvtnorm
包c.f.提供的API可能比使用这个单独的库更容易。亲爱的Dirk,感谢您的建议。我创建了一个包,将所有文件(.cpp、.h和.f)与make文件放在一起,解决了这个问题。很好,很好听。您不应该需要Makefile,最多需要一个Makevars。R知道该怎么做。
#include <Rcpp.h>
#include "mvtnorm.h"
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector pmvnorm_rcpp(NumericVector upper, NumericMatrix corr)
{
double error;
double mvnP = pmvnorm_P(2, upper, corr, &error) ;
return mvnP ;
}
/*** R
pmvnorm_rcpp(c(1.5,1.5),c(0.0))
*/