gpt4 book ai didi

r - 分配 n 个 NumericMatrix 的 Rcpp 列表

转载 作者:行者123 更新时间:2023-12-04 12:11:09 24 4
gpt4 key购买 nike

有没有办法分配一个长度为 n 的 Rcpp List,其中 List 的每个元素都将填充一个 NumericMatrix,但每个 NumericMatrix 的大小可以改变?

我有一个使用 std::list 和 push_back() 的想法,但是列表的大小可能非常大,我想避免在从功能。

下面的 R 代码给出了我希望做什么的想法:

myvec = function(n) {
x = vector("list", n)
for (i in seq_len(n)) {
nc = sample(1:3, 1)
nr = sample(1:3, 1)
x[[i]] = matrix(rbinom(nc * nr, size = 1, prob = 0.5),
nrow = nr, ncol = nc)
}
x
}

这可能会导致类似的结果:

> myvec(2)
[[1]]
[,1]
[1,] 0
[2,] 1

[[2]]
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 0 1 1

更新:根据@Dirk 和@Ralf 的评论,我创建了基于 Rcpp::List 和 std::list 的函数,并在末尾进行了换行。速度比较似乎并不偏向于一个版本优于另一个版本,但也许存在我不知道的低效率。

src = '
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List myvec(int n) {
Rcpp::RNGScope rngScope;
Rcpp::List x(n);
// Rcpp::IntegerVector choices = {1, 2 ,3};
Rcpp::IntegerVector choices = Rcpp::seq_len(50);
for (int i = 0; i < n; ++i) {
int nc = Rcpp::sample(choices, 1).at(0);
int nr = Rcpp::sample(choices, 1).at(0);
Rcpp::NumericVector entries = Rcpp::rbinom(nc * nr, 1, 0.5);
x(i) = Rcpp::NumericMatrix(nc, nr, entries.begin());
}
return x;
}

// [[Rcpp::export]]
Rcpp::List myvec2(int n) {
Rcpp::RNGScope scope;
std::list< Rcpp::NumericMatrix > x;
// Rcpp::IntegerVector choices = {1, 2 ,3};
Rcpp::IntegerVector choices = Rcpp::seq_len(50);
for (int i = 0; i < n; ++i) {
int nc = Rcpp::sample(choices, 1).at(0);
int nr = Rcpp::sample(choices, 1).at(0);
Rcpp::NumericVector entries = Rcpp::rbinom(nc * nr, 1, 0.5);
x.push_back( Rcpp::NumericMatrix(nc, nr, entries.begin()));
}
return Rcpp::wrap(x);
}
'
sourceCpp(code = src)

我电脑上的基准测试结果是:

> library(microbenchmark)
> rcpp_list = function() {
+ set.seed(10);myvec(105)
+ }
> std_list = function() {
+ set.seed(10);myvec2(105)
+ }
> microbenchmark(rcpp_list(), std_list(), times = 1000)
Unit: milliseconds
expr min lq mean median uq
rcpp_list() 1.8901 1.92535 2.205286 1.96640 2.22380
std_list() 1.9164 1.95570 2.224941 2.00555 2.32315
max neval cld
7.1569 1000 a
7.1194 1000 a

最佳答案

Rcpp 对象是 R 对象的基本问题支配着我的 R 的内存管理,其中调整大小非常昂贵:完整副本。

因此,当我的任务与您的任务类似且大小可能会发生变化或未知时,我经常使用不同的数据结构——STL 为我们提供了很多——并且仅在 返回时转换为 R(cpp) 最后一步。

细节决定成败(一如既往)。简介、实验、……

编辑:从狭义上讲,“我们可以返回具有不同大小的 NumericMatrix 对象列表吗”,答案是当然可以,因为这就是 List对象做。您还可以插入其他类型。

关于r - 分配 n 个 NumericMatrix 的 Rcpp 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59721834/

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