首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Rcpp NumericVector随机划分为2

将Rcpp NumericVector随机划分为2
EN

Stack Overflow用户
提问于 2015-06-27 10:29:49
回答 1查看 151关注 0票数 1

我试着把一个向量分成两个大小相等的较小的向量。通常在R中,这将使用以下命令完成

代码语言:javascript
运行
复制
indices = sample(1:length(x), length(x)/2)
a = x[indices]
b = x[-indices]

在Rcpp中,我可以复制RcppArmadillo中的示例函数。然而,看起来Rcpp中的子集并不能处理像x[-indices]这样的事情。

EN

回答 1

Stack Overflow用户

发布于 2015-06-27 13:08:10

您可以使用RcppArmadillo::sample将所有索引打乱,然后将前半部分提取为一个向量,将后半部分提取为另一个向量:

代码语言:javascript
运行
复制
// file.cpp
// [[Rcpp::depends(RcppArmadillo)]]

#include <RcppArmadilloExtensions/sample.h>

using namespace Rcpp ;

// [[Rcpp::export]]
List fxn(NumericVector x) {
  const int n = x.size();
  const int n2 = x.size()/2;

  // Randomly order indices
  NumericVector v(n);
  std::iota(v.begin(), v.end(), 0);
  NumericVector indices = RcppArmadillo::sample(v, v.size(), false);

  // Split up vectors
  NumericVector a(n2);
  NumericVector b(n - n2);
  for (int i=0; i < n2; ++i) a[i] = x[indices[i]];
  for (int i=n2; i < n; ++i) b[i-n2] = x[indices[i]];

  // Return as a list
  List ret;
  ret["a"] = a;
  ret["b"] = b;
  return ret;
}

这将返回您的拆分列表:

代码语言:javascript
运行
复制
library(Rcpp)
sourceCpp("file.cpp")
fxn(10:20)
# $a
# [1] 12 10 20 18 19
# 
# $b
# [1] 11 16 13 14 15 17
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31084553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档