2016-07-08 7 views
-1

Rcppに距離行列を格納する方法がわかりません。RcppにR - store distance行列を格納

私たちは、私がrcppでそうするかどうかはわからないですので(私はsumを二乗していない私はn*n個人の距離行列で、以下の機能を保存することを想像してみましょう。これで

distxy = function(x,y) sum (x - y) 

たとえば私は、この

ような行列をループ機能を希望 Rで3人

 [,1] [,2] [,3] [,4] 
[1,] 24 24 22 20 
[2,] 21 24 30 20 
[3,] 44 34 41 13 

を比較対毎のしたいです

 [,1] [,2] [,3] 
[1,] 0 -5 -42 
[2,] 5 0 -37 
[3,] 42 37 0 
私は私がこれまでに達成どのようなトラブル rcpp

で同じことをやって過ごしてい

// [[Rcpp::export]] 
NumericVector FunCpp(NumericMatrix x) { 
    int nrow = x.nrow(); 
    NumericMatrix out(nrow); 

    for (int i = 0; i < nrow; i++) { 
    for (int j = 0; j < nrow; j++) { 
     out[i,j] = sum(x(i,_) - x(j,_)) ; 
    } 
    } 
    return out; 
} 
である(ここでは重要でないで、私は結果を二乗することができますが、この)
mat = matrix(0, nrow(d), nrow(d)) 

    len = nrow(d) 
    mat = matrix(0, len, len) 

    for(j in 1:len){ 
    for(i in 1:len){ 
     mat[j,i] = distxy(d[j,], d[i,]) 
    } 
    } 

と取得

しかし、距離行列が正しくありません。何か案が ?

d = rbind(c(24, 24, 22, 20), 
     c(21, 24, 30, 20), 
     c(44, 34, 41, 13)) 
+2

C++の個別指導サービスとしてのStackOverflowを誤用しないでください。これは、短期間で_elementary_エラーを示す2番目の質問です。より野心的なRcppの冒険に着手する前に、あなたのC++を磨く必要があるかもしれないと思います。 –

答えて

4

あなたRcppコードの構文ミスのカップルがあります。代わりに、2次元(out[i,j]) によってインデックスにoperator[]を使用してNumericMatrix

  • NumericVectorを返す

    • は、

      クリーンアップされたバージョン:

      あなたがdistxyの内部std::powを使用することができ、あなたのRの機能に対する
      #include <Rcpp.h> 
      
      inline double distxy(Rcpp::NumericVector x, Rcpp::NumericVector y) { 
          return Rcpp::sum(x - y); 
      } 
      
      // [[Rcpp::export]] 
      Rcpp::NumericMatrix FunCpp(Rcpp::NumericMatrix x) { 
          int nrow = x.nrow(); 
          Rcpp::NumericMatrix out(nrow); 
      
          for (int i = 0; i < nrow; i++) { 
           for (int j = 0; j < nrow; j++) { 
            out(j, i) = distxy(x.row(j), x.row(i)); 
           } 
          } 
      
          return out; 
      } 
      

      テストを、

      m <- matrix(
          c(24, 24, 22, 20, 
           21, 24, 30, 20, 
           44, 34, 41, 13), 
          nrow = 3, byrow = TRUE 
      ) 
      
      all.equal(FunR(m), FunCpp(m)) 
      #[1] TRUE 
      
      乗用として

      return std::pow(Rcpp::sum(x - y), 2); 
      

      またはあなたの内側の内側のFunCpp

      ループ:

      out(j, i) = std::pow(distxy(x.row(j), x.row(i)), 2); 
      

      distxy <- function(x,y) sum(x - y) 
      
      FunR <- function(d) { 
          len <- nrow(d) 
          mat <- matrix(0, len, len) 
      
          for(j in 1:len){ 
           for(i in 1:len){ 
            mat[j,i] <- distxy(d[j,], d[i,]) 
           } 
          } 
          mat 
      } 
      
  • +0

    ありがとうございます。本当に感謝しております。私は本当に 'C++ 'に問題があります。 – giacomo

    関連する問題