C++ 如何向Rcpp函数声明输入?
我是绝对的C++ 如何向Rcpp函数声明输入?,c++,r,rcpp,C++,R,Rcpp,我是绝对的Rcpp-初学者,所以请注意,初学者的问题即将出现 考虑这个例子: #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericMatrix mat_1(NumericMatrix X){ do.stuff.with.X } 或者 SEXP mat_3(SEXP X){ NumericMatrix x(as<NumericMatrix>(X)) do.stuff.with.x }
Rcpp
-初学者,所以请注意,初学者的问题即将出现
考虑这个例子:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix mat_1(NumericMatrix X){
do.stuff.with.X
}
或者
SEXP mat_3(SEXP X){
NumericMatrix x(as<NumericMatrix>(X))
do.stuff.with.x
}
这里,我的理解是,Rcpp
-函数使用对R
对象的引用,而不是复制X
。事实上,我不确定我是否理解这意味着什么。使用SEXP
的目的不是不复制,还是我弄错了什么?而且,如果它节省了内存,因此效率更高,我为什么还要使用其他东西呢
我肯定我错过了一些选择。无论如何,我的大问题是:从R
用户(我)的角度来看,我调用每个函数mat_1、mat_2、mat_3
或mat_4
提供一个数字矩阵(这是我工作区中的一个R对象,因此是SEXP
),似乎我应该得到相同的输出(一个数字矩阵,从R
的角度来看,它将是一个SEXP
,对吧?)。我希望能得到一些关于这些看似相同的函数定义方法的相对优点的指导。也就是说,假设我们确切知道函数输入和输出是什么
numerimatrix
而不是SEXP
作为参数是值得的,反之亦然&
SEXP
?是否有理由坚持使用numerimatrix
mat_2
和mat_3
中使用的转换之间是否存在实际差异?也就是说,Rcpp::numerimatrix x(x)
和numerimatrix x(as(x))
感谢您的反馈。好的。试着给出一些线索。首先,如果您是初学者,第一个函数正确,请使用
mat_1
。随着您技能的提高,您可能会理解mat_1
与另一个函数之间的一些差异,并最终使用mat_1
,因为这就是你想用的
SEXP
mat_4
,则通过值传递和通过引用之间的区别会对调用产生影响C++函数< < /LI>
SEXP
是R的综合类型,如果你返回一个SEXP
它可以是任何东西,如果你返回一个numerimatrix
你通过设计知道你返回了一个数字矩阵,这是Rcpp存在的巨大优势和几乎全部原因as
会更加努力,但在这种情况下没有什么区别
<> P> >使用<代码> Matth1 。还有很多其他的东西要学习,不要担心这一点。你问几个问题,它把C++的一般问题与RCPP的细节混合在一起。所以有很多关于前者的巨大资源;我们用后者来传送八个小插图,然后还有。格力。我的一个问题是,我不能很容易地区分Rcpp和C++的细节,因为我只知道C++通过Rcpp,但是我意识到这是一个问题,当我问一个问题。我知道这些小插图和书。它们是巨大的资源,并且在那里的例子帮助我开始了一个大的问题,但我觉得他们,特别是这本书,需要大量的背景知识,这使得阅读某个特定的主题变得困难。如果你不知道你在寻找什么,这是一个问题,我认为这是一个典型的初学者的问题。但是,如果你能指给我一个特殊的小插曲,在那里我可以找到上述问题的答案(甚至可能是我应该查找的特定部分或关键字)我很感激。谢谢Romain!我很感激你的反馈。只是对我的问题的一个很快的跟进:1.我知道对函数参数使用
SEXP
可以避免内存中的副本。如果我有非常大的矩阵,比如说,我是否应该因此更喜欢使用SEXP
?2.对于你的观点2,如果我要使用C++
函数中(我将),我更喜欢使用&
?除了SEXP,none,zero之外,numerimatrix中没有额外的内存。不管矩阵有多大。你不需要为numerimatrix付费。但是你可以得到一些方便使用的东西。对于2,不是真的,按值传递矩阵很便宜,因为数据也不会被复制,只有指针。我不能给出代码示例do.stuff.with.X
。对于像NumericMatrix这样的Rcpp类型,只需通过值传递它们。好的,我明白了。感谢Romain花时间来帮助我。我非常感谢!
SEXP mat_3(SEXP X){
NumericMatrix x(as<NumericMatrix>(X))
do.stuff.with.x
}
NumericMatrix mat_4( NumericMatrix X&){
do.stuff.with.X
}