gpt4 book ai didi

c++ - Rcpp 将 vector 复制到 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:44 26 4
gpt4 key购买 nike

一般来说,我是 Rcpp 和 C++ 编码的新手,所以请原谅我提出基本问题。代码的cpp部分是

// test.cpp

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void testRun() {
IntegerVector Grp1 = IntegerVector::create(1,2,3,4);
IntegerVector Grp2 = IntegerVector::create(3,4,5,6);

Rf_PrintValue(Grp1);
Grp1 = Grp2;
Rf_PrintValue(Grp1);
Grp2[3] = Grp2[3]+1;
Rf_PrintValue(Grp1);
}

当我运行 testrun() 时,我得到了输出

> Rcpp::sourceCpp('test.cpp')
> testRun()
[1] 1 2 3 4
[1] 3 4 5 6
[1] 3 4 5 7

当我在 Gr1 = Gr2 中将 Gr2 分配给 Gr1 时,在分配更改后更改 Gr2 中的元素Gr1 中的值也是如此。 IntegerVectors 是否有一个函数可以执行类似 Gr1 = Gr2 的拷贝 的操作,或者我应该使用循环来执行此操作。

非常感谢!

最佳答案

正如评论中所暗示的,您可以使用

Grp1 = clone(Grp2) ;

但这将创建一个新的 R 对象,然后将其分配给 Grp1,因此您需要支付一些内存分配费用并丢弃一些本可以使用的内存,即垃圾收集器的更多工作下线。

您也可以使用 std::copy 重用 Grp1 中的现有内存

std::copy( Grp2.begin(), Grp2.end(), Grp1.begin() ) ;

另一种可能过于复杂的方法是使用sapply。像这样:

auto identity = [](double x){ return x; } ;
Grp1 = sapply( Grp2, identity );

但给定 Rcppsapply over lambdas ,您可能必须在函数之外定义 identity 才能使用此方法。

inline double identity(double x){ 
return x ;
}

FWIW,在 Rcpp14Rcpp11 中,您可以简单地执行以下操作:

Grp1 = import(Grp2) ;

关于c++ - Rcpp 将 vector 复制到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28664894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com