2017-09-05 16 views
1

this postを見て、Rcppで行列をサブセット化しようとしました。 RcppArmadilloRcppGSLを使った行列の高速サブセット

// [[Rcpp::depends(RcppArmadillo)]] 
#include "RcppArmadillo.h" 
// [[Rcpp::export]] 
arma::mat submatrix(const arma::mat& m1in, int fromin, int toin){ 
    arma::mat s1 = m1in.cols(fromin-1,toin-1); 
    return(s1); 
} 

その後submatrix(M, 1, 900)M[,1:900]よりも少し速いです。 RcppGSL

#include <RcppGSL.h> 
#include <gsl/gsl_matrix.h> 
// [[Rcpp::export]] 
gsl_matrix_const_view submatrix(const RcppGSL::Matrix & X, int k1, int k2, int n1, int n2) { 
    return gsl_matrix_const_submatrix(X, k1, k2, n1, n2); 
} 

ここsubmatrix(M, 0, 0, 1000, 900)M[,1:900]より遅いです:

> microbenchmark(M[,1:900], submatrix(M, 0, 0, 1000, 900)) 
Unit: milliseconds 
          expr  min  lq  mean median  uq  max neval 
        M[, 1:900] 8.035749 10.20265 13.25657 11.75554 14.27586 117.2533 100 
submatrix(M, 0, 0, 1000, 900) 16.597605 19.55858 23.04454 21.52959 23.98431 141.6158 100 

RcppGSLで行列をサブセットに速い方法はありますか?

答えて

1

私はあなたの行列が参照によって渡されていないと考えています(多分R行列とGSL行列は互換性がないためです)。

が私のポイントを証明するために、これをテスト:私は正しいんだ場合

// [[Rcpp::depends(RcppGSL)]] 
#include <RcppGSL.h> 
#include <gsl/gsl_matrix.h> 

// [[Rcpp::export]] 
gsl_matrix_const_view submatrix(RcppGSL::Matrix & X, int k1, int k2, int n1, int n2) { 
    X(0, 0) = 1; 
    return gsl_matrix_const_submatrix(X, k1, k2, n1, n2); 
} 

/*** R 
M <- matrix(0, 1000, 1000) 
test <- submatrix(M, 0, 0, 1000, 900) 
M[1, 1] 
*/ 

が、あなたは毎回あなたがRcppGSLを使用するのと同じ問題を抱えているだろう。多分&(私はGSLを知らない)の代わりに使用する行列(Eigenのような)のマップビューが存在するでしょう。

関連する問題