【发布时间】:2015-07-14 02:49:35
【问题描述】:
我的任务是用 C++ 重写一个 R 函数来加速 while 循环。除.Fortran() 外,所有R 代码都在Rcpp 和Armadillo 的帮助下重写。我首先尝试使用 Rinside,但正如 Dirk 所指出的那样,它以非常慢的速度工作。 (数据经过 R -> C++ -> R -> Fortran 代价高昂)
由于我不想用 C++ 重写 Fortran 代码,反之亦然,通过将 C++ 直接链接到 Fortran 来加速程序看起来很自然:R -> C++ -> Fortran。
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
extern "C"{
List f_(int *n,NumericMatrix a, NumericVector c, double* eps);
}
问题是我可以将 C++ 与 Fortran 集成,将 R 与 C++ 集成,但我无法让这三个东西一起工作!
我尝试在 Linux 中编译 C++,但找不到 RcppArmadillo.h 和 namespace Rcpp:
error: RcppArmadillo.h: No such file or directory
error: 'Rcpp' is not a namespace-name
当我直接在 R 中调用sourceCpp("test.cpp") 时,控制台会显示:
test.o:test.cpp:(.text+0x20b2): undefined reference to `f_'
collect2: ld returned 1 exit status
Error in sourceCpp("test.cpp") : Error occurred building shared library.
我也尝试将所有这些东西组合在一个包中
RcppArmadillo::RcppArmadillo.package.skeleton("TTTest")
但是在将.cpp和.f文件添加到/src并运行compileAttributes之后,我不知道如何处理包TTTest(我相信它无法安装)。
那么,有没有可能像我想象的那样做 Rcpp 的事情?还是需要将 Fortran 代码转换为 C/C++ 代码?
感谢您的帮助。
【问题讨论】:
-
您的编译器(好吧,预处理器)找不到文件“RcppArmadillo.h”。确保它与“*.cpp”文件位于同一目录中,或者以任何其他方式可访问(提示:“-I”)
-
是的,它应该像
include "RcppArmadillo.h"但它仍然找不到其他头文件。而且我怀疑用 Rcpp 编译文件需要更多时间,因为最后我会在 R 中调用该函数 -
如果这个问题仍然相关,请查看this answer。调用的函数还是一个C函数,但最后使用了一个Fortran子程序。
标签: c++ r fortran rcpp armadillo