RcppArmadillo 和 RcppGSL

Posted

技术标签:

【中文标题】RcppArmadillo 和 RcppGSL【英文标题】:RcppArmadillo and RcppGSL 【发布时间】:2013-12-15 16:23:11 【问题描述】:

我想通过 sourceCpp 同时使用 。基本上我有兴趣修改B样条示例

http://dirk.eddelbuettel.com/blog/2012/12/08/

因此 B 样条是 R^3 的函数,而不仅仅是 R^1。这需要使用 GSL 中显然不支持的 3 维数组(尽管这里有一个扩展 http://savannah.nongnu.org/projects/marray)。但是,RcppArmadillo 具有 arma::cube 类型,如果我能让 “一起工作”,我就可以使用它。不幸的是,我无法做到这一点。我看过了

Multiple plugins in cxxfunction

但没有成功创建提到的组合插件。非常感谢任何帮助!

亚当

编辑:似乎实际上可以编译一个带有 sourceCpp 的 .cpp 文件,该文件在顶部包含以下命令序列:

// [[Rcpp::depends(RcppGSL)]]
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <RcppGSL.h>
#include <gsl/gsl_bspline.h>

此外,似乎也可以存储类似的值

双 gsl_vector_get (const gsl_vector * v, size_t i)

在 arma::cube 结构中。

【问题讨论】:

【参考方案1】:

RcppArmadillo.hRcppGSL.h 的建模类似。它们首先包括RcppCommon.h,然后是一些前向声明,然后它们包括使用这些前向声明的Rcpp.h,然后是实现。

如果您想出正确的包含顺序,绝对可以同时使用它们。

这绝对是一个 Rcpp 问题,因为阻止您同时使用它们的是(好或坏)设计决策。

您需要研究RcppArmadillo.hRcppGSL.h 并提出正确的包含顺序,或者等待有人遵循这些提示并给您答案。在接下来的几天里,我可能没有时间自己做。

【讨论】:

我会尝试查看 .h 文件。谢谢! RcppArmadillo 和 RcppGSL 是与 R 进行通信和交换数据的机制。但是在这里,OP 想要直接连接 Armadillo 和 GSL(“我可以将 Arma::cube 粘贴到 GSL 中以获得 R^ 3 样条曲线?”)即使两个库都可以通过我们的工具连接到 R,哪一个也做不到。 好吧,实际上我想使用 RcppGSL 在 R^1 的三个子集上评估三组 B 样条函数,然后将这些值存储在 arma::cube 中。这已经是可能的了 是的。但是你不能直接在犰狳中分配(Rcpp)GSL 向量,但你可以通过 R(和 Rcpp)数据结构,或者通过中间表示像 std::vector&lt;double&gt; 一样,或者,如果你必须,double* . 我可以在 R^1 的三个子集上评估三组 B 样条函数。对于每个数据点和每个 B 样条,我都会得到一个值。这个值我想存储在一个矩阵中(不一定是 arma::mat)。这给了我三个矩阵。然后应该组合这些矩阵中的值(结合模拟程序),然后将结果值存储在一个数组中 - 一个 arma::cube。如在 B 样条示例中,如果我执行 double Bj = gsl_vector_get(B, j);那么 Bj 是一个“常规”双精度,可以存储在一个 arma::mat 中吗?【参考方案2】:

犰狳类型和 GSL 类型不可互换。

您可以为犰狳重写 GSL 算法,但这不是自动的,而是任何方式。我也不确定样条线背后的理论是否就像从实线延伸到三维。

【讨论】:

好的。但是是否不可能同时使用 GSL 和 Armadillo 库来编写 c++ 程序(即没有 R 因此涉及 Rcpp)?我的想法只是实现所谓的张量 B 样条。这些基本上可以作为一维 B 样条的线性组合来获得。 真的!由于张量样条计算是“循环的”,如果能够以 c++ 的速度进行计算,然后将数据传输到 R,那就太好了。 我只是说你现在遇到了一个通用的 C++(或建模)问题,所以你可能想改变它所在的标签... 借助 Rcpp,将 C++ 解决方案导入 R 很容易.

以上是关于RcppArmadillo 和 RcppGSL的主要内容,如果未能解决你的问题,请参考以下文章

RcppArmadillo 和 RcppGSL

带有 Rcpparmadillo 的 Rcppnumerical 和 RcppEigen 中的 obtim_lbfgs 函数

分配了矩阵列标准差的向量正在改变其值 (RcppArmadillo)

无法编译 RcppArmadillo

错误:R 3.5.3上的程序包RcppArmadillo的延迟加载失败

RcppArmadillo: arma::cube 的向量