我是Rcpp
及其功能的新手,更不用说C ++本身了,所以这对你们这些专家来说可能看起来微不足道。然而,没有一个愚蠢的问题,所以无论如何:
我想知道是否有一种方法可以使用索引一次性地在C ++中处理NumericVector的多个元素。为了使整个事情更清楚,这里的R等价于我正在尝试做的事情:
# Initial vector
x <- 1:10
# Extract the 2nd, 5th and 8th element of the vector
x[c(2, 5, 8)]
[1] 2 5 8
这是我到目前为止在C ++函数中使用sourceCpp
在R中执行的内容。它有效,但对我来说似乎很不方便。有没有更简单的方法来实现我的目标?
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector subsetNumVec(NumericVector x, IntegerVector index) {
// Length of the index vector
int n = index.size();
// Initialize output vector
NumericVector out(n);
// Subtract 1 from index as C++ starts to count at 0
index = index - 1;
// Loop through index vector and extract values of x at the given positions
for (int i = 0; i < n; i++) {
out[i] = x[index[i]];
}
// Return output
return out;
}
/*** R
subsetNumVec(1:10, c(2, 5, 8))
*/
> subsetNumVec(1:10, c(2, 5, 8))
[1] 2 5 8
答案 0 :(得分:1)
如果使用犰狳矢量而不是Rcpp矢量,则可以执行此操作。
Rcpp Gallery有post with a complete example:特别参见第二个例子。您的索引条目必须位于(未签名)uvec
或umat
。
答案 1 :(得分:0)
我认为没有更短的方法!
但您的NumericVector subsetNumVec(NumericVector x, IntegerVector index)
容易出错:
在这一行
out[i] = x[index[i]];
您无需范围检查即可访问矢量。因此,在琐碎的情况下,x
为空或索引超出范围,您会得到一些未定义的行为。
此外,您的方法可以通过引用
进行调用NumericVector subsetNumVec(const NumericVector& x, const IntegerVector& index)
没有理由复制这两个载体。您只需将减去index = index -1;
移至out[i] = x.at(index[i] - 1);
这里,x.at(index[i] - 1)
会抛出错误的索引。但是你需要一些错误处理(返回空向量或在外面进行处理)。