まずは初心者ですので、私の一般的な無知を忘れてしまいます。 Rの%*%演算子のより高速な代替方法を探しています。以前の投稿ではRcppArmadilloの使用を提案していましたが、RcppArmadilloを成功させるために2時間試しました。私はいつも予期せぬエラーを生じる字句問題にぶつかります。Rcppの行列乗算
library(Rcpp)
func <- '
NumericMatrix mmult(NumericMatrix m , NumericMatrix v, bool byrow=true)
{
if(! m.nrow() == v.nrow()) stop("Non-conformable arrays") ;
if(! m.ncol() == v.ncol()) stop("Non-conformable arrays") ;
NumericMatrix out(m) ;
for (int i = 0; i < m.nrow(); i++)
{
for (int j = 0; j < m.ncol(); j++)
{
out(i,j)=m(i,j) * v(i,j) ;
}
}
return out ;
}
'
この機能は、しかし、要素ごとの乗算を実行し、%※%として動作しません:私は、私は仕事にすることができませんRcppに次の関数を発見しました。意図した結果を得るために上記のコードを変更する簡単な方法はありますか?
編集:私はRcppArmadilloであなたの問題をうまくしようとすることをお勧めします
etest <- cxxfunction(signature(tm="NumericMatrix",
tm2="NumericMatrix"),
plugin="RcppEigen",
body="
NumericMatrix tm22(tm2);
NumericMatrix tmm(tm);
const Eigen::Map<Eigen::MatrixXd> ttm(as<Eigen::Map<Eigen::MatrixXd> >(tmm));
const Eigen::Map<Eigen::MatrixXd> ttm2(as<Eigen::Map<Eigen::MatrixXd> >(tm22));
Eigen::MatrixXd prod = ttm*ttm2;
return(wrap(prod));
")
set.seed(123)
M1 <- matrix(sample(1e3),ncol=50)
M2 <- matrix(sample(1e3),nrow=50)
identical(etest(M1,M2), M1 %*% M2)
[1] TRUE
res <- microbenchmark(
+ etest(M1,M2),
+ M1 %*% M2,
+ times=10000L)
res
Unit: microseconds
expr min lq mean median uq max neval
etest(M1, M2) 5.709 6.61 7.414607 6.611 7.211 49.879 10000
M1 %*% M2 11.718 12.32 13.505272 12.621 13.221 58.592 10000
コメントは、そのRcppEigenで部分的に間違ってい_not_システムのコピーに依存しませんEigenのものですが、他のRパッケージと同様の独自のものです。 –
ああ、説明をくれてありがとう、@DirkEddelbuettel。知っておいてよかった。私はそれがラッパーだと思った。 – RHertel