2016-04-30 8 views
-2

行列のk行を置き換えるために一時変数を使用することについて質問したいと思います。行列の `k`番目の行をRcppでゼロに置換する

Xの行を0に置き換えたいとします。

Xのコピーを作成しました。Ynew1と呼ばれ、繰り返しごとにYnew1の値がX(最初の値)で更新されます。しかし、私のコードでは、Ynew1の行が0に置き換えられるだけでなく、Xもあります。残念なことに、結果はYnew1はすべて行列ゼロです(私は最後の行がゼロの値を持っていると思います)。これはコード:

cppFunction(' 
      NumericMatrix cobo(NumericMatrix X){ 
      int n = X.nrow(); 
      NumericMatrix Ynew1(n,1); 

      for (int k=0;k<n;k++){ 
       Ynew1 = X; 
       for(int i=0;i<n;i++){ 
        Ynew1(k,i)=0; 
       } 
      } 

      return(Ynew1); 
      } 
      ') 

答えて

2

大丈夫です。

使用しているため、ループ構造が理想的ではないゼロ

によってxk番目の行を置き換える:私はあなたが達成しようとしている目的は、以下のだと思います。それぞれiまたは行の反復で、xYnewに再コピーしてから、行をゼロにします。

cppFunction(' 
// @param x A \code{matrix} with dimensions n x m. 
// @param k An \code{unsigned int} whose index begins at 1. 
// @return A \code{matrix} with row \code{k} equal to zero. 
Rcpp::NumericMatrix cobo(Rcpp::NumericMatrix x, unsigned int k){ 
    unsigned int n = x.nrow(); 

    // Bounds check 
    if(k - 1 >= n){ stop("OOB Error"); } 

    // Replace row by a vector of zeros. 
    x(k - 1, Rcpp::_) = Rcpp::NumericVector(x.ncol()); 

    return x; 
} 
') 

注:関数は、R行列入力を処理する。この場合

、ちょうどのでようk行目を標的とすべきです。 (例えばインデックスが1から始まると想定していないC++の0)

例:

set.seed(11) # Set seed for reproducibility 
(x = matrix(rnorm(10),nrow = 5)) 

      [,1]  [,2] 
[1,] -0.59103110 -0.93415132 
[2,] 0.02659437 1.32360565 
[3,] -1.51655310 0.62491779 
[4,] -1.36265335 -0.04572296 
[5,] 1.17848916 -1.00412058 

cobo(x, 3) 

      [,1]  [,2] 
[1,] -0.59103110 -0.93415132 
[2,] 0.02659437 1.32360565 
[3,] 0.00000000 0.00000000 
[4,] -1.36265335 -0.04572296 
[5,] 1.17848916 -1.00412058 
関連する問題