Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
C++ 如何向Rcpp函数声明输入?_C++_R_Rcpp - Fatal编程技术网

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
  • 在这种情况下,这没有什么区别。Rcpp将知道如何处理引用,但发生的情况基本相同,它在本地某处创建了一个对象,并为您提供对该对象的引用。如果要从ano调用
    mat_4
    ,则通过值传递和通过引用之间的区别会对调用产生影响C++函数< < /LI>
  • 如果你知道类型,就使用类型。这就是Rcpp的全部要点。
    SEXP
    是R的综合类型,如果你返回一个
    SEXP
    它可以是任何东西,如果你返回一个
    numerimatrix
    你通过设计知道你返回了一个数字矩阵,这是Rcpp存在的巨大优势和几乎全部原因
  • 我让你决定你是否没有抓住要点

    一般来说,
    as
    会更加努力,但在这种情况下没有什么区别


    <> P> >使用<代码> Matth1 。还有很多其他的东西要学习,不要担心这一点。

    你问几个问题,它把C++的一般问题与RCPP的细节混合在一起。所以有很多关于前者的巨大资源;我们用后者来传送八个小插图,然后还有。格力。我的一个问题是,我不能很容易地区分Rcpp和C++的细节,因为我只知道C++通过Rcpp,但是我意识到这是一个问题,当我问一个问题。我知道这些小插图和书。它们是巨大的资源,并且在那里的例子帮助我开始了一个大的问题,但我觉得他们,特别是这本书,需要大量的背景知识,这使得阅读某个特定的主题变得困难。如果你不知道你在寻找什么,这是一个问题,我认为这是一个典型的初学者的问题。但是,如果你能指给我一个特殊的小插曲,在那里我可以找到上述问题的答案(甚至可能是我应该查找的特定部分或关键字)我很感激。谢谢Romain!我很感激你的反馈。只是对我的问题的一个很快的跟进:1.我知道对函数参数使用
    SEXP
    可以避免内存中的副本。如果我有非常大的矩阵,比如说,我是否应该因此更喜欢使用
    SEXP
    ?2.对于你的观点2,如果我要使用的输出de>mat_4在另一个
    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
    }