2016-04-12 1 views
1

私は、サブセットに入れたい位置を表すvector<int> positionsと、サブセットにしたい2つのRcpp::NumericVectorベクターAB(どちらもvector<double>とも扱うことができます)とします。 Rに私は sum(A[positions])double)、またはA[positions]/B[positions]vector[double])と書くだろうかを計算するための最良の方法だろう何ベクトルのサブセットに関数を適用する最適な方法は何ですか?

? 基本的には、コピーを作成せずに特定の位置にあるベクトルの要素にアクセスしたいと思っていれば、その要素にアクセスしたいと思います(またはforループ)。

R中:

positions = c(2,4,5) # just a vector with positions 
A = rnorm(100) # a vector with 100 random numbers 
B = rnorm(100) 

mysum <- sum(A[positions]) 
mysmallvector <- A[positions]/B[positions] # or (A/B)[positions] 

を今、私はちょうどpositionsのすべての値をループし、そして1によって位置一つのベクトルのサブセットが、私はよりエレガントな解決策があると考えて助けることができません。

+0

は、forループできません回避:あなたはあなたのコレクションを反復処理する必要があります。これはRが背後で何をしているかでもあります。一方、より洗練されたAPIが必要な場合は、独自のクラスを作成するか、十分なC++マトリックスライブラリを使用する必要があります。 – OnMyLittleDuck

答えて

2

したがって、RcppのRの機能を複製することは必ずしも理想的ではありません。 1つは、Rcppの砂糖表現を使用して、subsetting in Rcppに注意してください。第2に、ベクトル化構造Rによって、R内でさえもforループを使用しています。

Rcppデータ型の代わりにRcppArmadilloを使用することをお勧めします。欠点は、データがC++に移植されてからRに戻るときにコピーヒットが発生することです。Rcppデータ型を使用すると、それを回避できますが、独自の操作を定義する必要があります(divide_subset()を参照してください)。 )。これにより

たちはRcpp経由で要求された機能を複製することができ、言われている:

#include <Rcpp.h> 
using namespace Rcpp; 

// Uses sugar index subsets 
// [[Rcpp::export]] 
NumericVector subset(NumericVector x, IntegerVector idx) { 
    return x[idx]; 
} 

// Uses sugar summation function (e.g. a nice for loop) 
// [[Rcpp::export]] 
double sum_subset(NumericVector x, IntegerVector idx) { 
    return sum(subset(x,idx)); 
} 

// No sugar for element-wise division 
// [[Rcpp::export]] 
NumericVector divide_subset(NumericVector x, NumericVector y, IntegerVector idx) { 
    unsigned int n = idx.size(); 
    NumericVector a(n); 
    for(unsigned int i = 0; i < idx.size(); i++){ 
    a[i] = x[idx[i]]/y[idx[i]]; 
    } 

    return a; 
} 


/*** R 
set.seed(1334) 
positions = c(2,4,5) 

# Subtract one from indexes for C++ 
pos_cpp = positions - 1 

A = rnorm(100) # a vector with 100 random numbers 
B = rnorm(100) 

mysum = sum(A[positions]) 

cppsum = sum_subset(A, pos_cpp) 
all.equal(cppsum, mysum) 

mysmallvector = A[positions]/B[positions] # or (A/B)[positions] 

cppdivide = divide_subset(A,B, pos_cpp) 
all.equal(cppdivide, mysmallvector) 
*/ 
関連する問題