Rcpp中的布尔向量子集向量

Posted

技术标签:

【中文标题】Rcpp中的布尔向量子集向量【英文标题】:Subset vector by bool vector in Rcpp 【发布时间】:2019-04-13 17:05:23 【问题描述】:

我想用 bool 向量对向量 1,2,3,4 进行子集化。例如,如果我的布尔向量是 false,true,true,true,我想得到向量 2,3,4。在常规 R 中,我可以使用

    sample_states<-c(1:4)[c(a,b,c,d)]

其中 a,b,c,d 是布尔值。我的问题是双重的:1)如何使用 Armadillo/Rcpp 创建一个布尔向量,以及 2)如何使用该向量来子集我的向量 1,2,3,4。提前感谢您的宝贵时间。

【问题讨论】:

这在Rcpp Gallery的“索引”帖子中得到了回答——请阅读这些内容。 谢谢,我会仔细阅读的。画廊中有没有我可以寻找创建布尔矩阵和向量的地方?感谢您的宝贵时间。 【参考方案1】:

这里有两个快速示例如何创建 Rcpp::LogicalVector 并使用它来子集另一个向量:

#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]

// [[Rcpp::export]]
Rcpp::NumericVector subset1() 
  Rcpp::NumericVector in = 1.0, 2.0, 3.0, 4.0;
  Rcpp::LogicalVector mask = false, true, true, true;
  return in[mask];


// [[Rcpp::export]]
Rcpp::NumericVector subset2() 
  Rcpp::NumericVector in = Rcpp::runif(10);
  Rcpp::LogicalVector mask = in > 0.5;
  return in[mask];


/*** R
subset1()
set.seed(42)
subset2()
*/

第一个示例使用 C++11 中的“支撑初始化”快速生成LogicalVector。您可以轻松地单独分配值。第二个示例使用逻辑表达式创建LogicalVector。在这两种情况下,子设置看起来都非常像 R 中的(感谢 Rcpp 糖)。

正如 Dirk 在 cmets 中所说:Rcpp gallery 中有更多示例。只需搜索“indexing”或“LogicalVector”即可。

【讨论】:

以上是关于Rcpp中的布尔向量子集向量的主要内容,如果未能解决你的问题,请参考以下文章

Rcpp R 向量大小限制(不允许负长度向量)

如何在Rstudio中调用Rcpp向量的对数函数

使用 Rcpp 的高效矩阵子集

使用 Rcpp 从 C 中获取矩阵/向量类型

在rcpp犰狳中将向量与double进行比较

提取向量的向量子集