2016-07-23 29 views
0

別のベクトル(私がarma::vecクラスを使用していた場合)? Rで私は変化素子

v1 = 1:10 
pos = c(2,4,10) 
v2 = c(3,8,2) 
v1[pos] = v2 

とどうなるのかと言う明確なforループを行うことなく可能このですか?

謝罪これは些細な疑問...

+0

たぶん開始するために[RcppArmadilloのサブセット](http://gallery.rcpp.org/articles/armadillo-subsetting/)を見てください。 –

+0

私はそれを見ていましたが、それはサブセットについてのものでしたが、私の場合は選択された要素に新しい値を割り当てることについて確信が持てませんでした...ちょっとですが、Rcpp&RcppArmadilloを初めて使用しています... –

答えて

2

であれば、私はそれが本当にすでにRcpp Gallery: RcppArmadillo Subsettingポストに答えているにもかかわらず、この質問に答えるつもりです。

サブセット化操作

アルマジロで

は、APIは場所を取るために、この操作を可能にsubmatrix viewsを持っています。

#include <RcppArmadillo.h> 
using namespace Rcpp; 

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
arma::vec so_subset_params(arma::vec x, arma::uvec pos, arma::vec vals) { 
    // Subset and set equal to 
    x.elem(pos) = vals; 
    return x; 
} 

/*** R 
v1 = 1:10 
pos = c(2,4,10) 
v2 = c(3,8,2) 
so_subset_params(v1, pos-1, v2)  
*/ 

これは与える:あなたの例アルマジロで100%を複製するにはアルマジロに

をRコードの複製

 [,1] 
[1,] 1 
[2,] 3 
[3,] 3 
[4,] 8 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
[9,] 9 
[10,] 2 

、使用:このよう

// [[Rcpp::export]] 
void so_subset() { 

    // --------------- 1:10 
    arma::vec v1 = arma::linspace(1,10,10); 

    Rcpp::Rcout << "Initial values of V1:" << std::endl << v1 << std::endl; 

    // --------------- pos=c(2,4,10) 

    // One style to create a subset index 
    arma::uvec pos(3); 
    pos(0) = 2; pos(1) = 4; pos(2) = 10; 

    Rcpp::Rcout << "R indices pos:" << std::endl << pos << std::endl; 


    // Adjust for index shift R: [1] => Cpp: [0] 
    pos = pos - 1; 

    Rcpp::Rcout << "Cpp indices pos:" << std::endl << pos << std::endl; 


    // --------------- v2 = c(3,8,2) 

    // C++98 
    arma::vec v2; 
    v2 << 3 << 8 << 2 << arma::endr; 

    // C++11 
    // arma::vec v2 = { 3, 8, 2}; // requires C++11 plugin 

    Rcpp::Rcout << "Replacement values v2:" << std::endl << v2 << std::endl; 

    // --------------- v1[pos] = v2 

    // Subset and set equal to 
    v1.elem(pos) = v2; 

    Rcpp::Rcout << "Updated values of v1:" << std::endl << v1 << std::endl; 
} 

/*** R 
so_subset() 
*/ 

を、あなたが持っているでしょう各操作に関連する次の出力

Initial values of V1: 
    1.0000 
    2.0000 
    3.0000 
    4.0000 
    5.0000 
    6.0000 
    7.0000 
    8.0000 
    9.0000 
    10.0000 

R indices pos: 
     2 
     4 
     10 

Cpp indices pos: 
     1 
     3 
     9 

Replacement values v2: 
    3.0000 
    8.0000 
    2.0000 

Updated values of v1: 
    1.0000 
    3.0000 
    3.0000 
    8.0000 
    5.0000 
    6.0000 
    7.0000 
    8.0000 
    9.0000 
    2.0000 

+0

聖人... –

+0

詳細な説明をありがとう!それは素晴らしいです!そしておそらく些細な質問のために再び謝罪します - 私は今週Rcppについて学び始めました! –