私の主な目標は、行と列に2組のバイナリベクトルを使用して非連続サブマトリクスを選択することです。これは、Rcpp、RcppArmadillo、RcppEigenを使ってC++で実装しているMCMCループのために必要な多くのステップの1つです。非隣接サブマトリクス選択のRcppArmadilloとRランニングスピードの比較
これを行うには、(1)RcppArmadilloを使用する、(2)RcppからR関数を呼び出し、(3)Rを直接使用して結果をC++に渡す方法が考えられます。最後の選択肢は私にはまったく便利ではありませんが。
次に、これら3つのシナリオのパフォーマンススピードを比較しました。興味深いことに、ダイレクトRコードは他の2つのコードよりはるかに高速です! Rcppから正確なR関数を呼び出すと、Rから直接呼び出すよりもはるかに遅いです。私は、これらの関数が、このolder postの例で示唆されているように比較的同じ実行速度を持つことを期待していました。
とにかく、タイミングの結果はちょっと奇妙なようです。その理由に関するコメント?私は、エルキャピタンのOS、2.5GHz Intel Core i7でMacBook Proを使用しています。それは私のシステム、Mac OSX、またはRcppが私のマシンにインストールされている方法に関係していますか?
ありがとうございます!ここで
は、コードは次のとおりです。
CPP章:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// (1) Using RcppArmadillo functions:
// [[Rcpp::export]]
mat subselect(NumericMatrix X, uvec rows, uvec cols){
mat XX(X.begin(), X.nrow(),X.ncol(), false);
mat y = XX.submat(find(rows>0),find(cols>0));
return (y);
}
// (2) Calling the function from R:
// [[Rcpp::export]]
NumericalMatrix subselect2(NumericMatrix X, NumericVector rows, NumericVector cols){
Environment stats;
Function submat = stats["submat"];
NumericMatrix outmat=submat(X,rows,cols);
return(wrap(outmat));
}
Rセクション:
library(microbenchmark)
# (3) My R function:
submat <- function(mat,rvec,cvec){
return(mat[as.logical(rvec),as.logical(cvec)])
}
# Comparing the performances:
// Generating data:
set.seed(432)
rows <- rbinom(1000,1,0.1)
cols <- rbinom(1000,1,0.1)
amat <- matrix(1:1e06,1000,1000)
//benchmarking:
microbenchmark(subselect(amat,rows,cols),
subselect2(amat,rows,cols),
submat(amat,rows,cols))
結果:
expr min lq mean median uq max neval
subselect(amat, rows, cols) 893.670 1566.882 2297.991 1675.282 2184.783 8462.142 100
subselect2(amat, rows, cols) 928.418 1581.553 3554.805 1657.454 2060.837 138801.050 100
submat(amat, rows, cols) 36.313 55.748 66.782 62.709 73.975 136.970 100
私はこれらのタイミングを再現することはできません。 R機能に対してArmadillo機能を実行すると、前者は[自分のマシンで2倍速く](https://gist.github.com/nathan-russell/6273deceeed9e71a80aea054edaadf4d)です。 *コードをベンチマークしたデータを含めてください。* – nrussell
面白い!私のケースで何が起こっているのだろうか... 申し訳ありません私はベンチマークで使用したデータを含めることを忘れていました。私はちょうど上記の私の投稿に含まれています。私のデータを使って得たものをテストしてください。 –