Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
联合收割机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 - Fatal编程技术网

联合收割机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()
仅用于一个文件解决方案(除非您给出链接说明)


最简单的修复:只需在 SRC/< /COD>中创建一个包集合所有的包。

是的, MVTDST> /Corp>是FORTRAN函数,在C++函数中,它使用的是代码> MVTDSST<。这里,我用C++代码来实现。当我单独编译C++代码时,它工作得很好。但当我尝试在RCpp包中使用
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))
*/