首先,我是一个新手用户,所以忘记了我的一般无知。我正在寻找一种更快的替代方法来运行R中的%*%运算符。尽管较旧的帖子提示使用RcppArmadillo,但我已经尝试了2个小时来使RcppArmadillo无法成功运行。我总是遇到产生'意外...'错误的词汇问题。我发现在RCPP下面的功能,我可以让工作: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 ;
}
'
这个功能,但是,进行逐元素乘法和不表现为%*%。有没有简单的方法来修改上面的代码来实现预期的结果?
编辑:
我已经想出了使用RcppEigen似乎击败%*%功能:
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 _不_依靠系统复制Eigen,但带来自己的,类似于其他R包。 –
啊,谢谢你的澄清,@DirkEddelbuettel。很高兴知道。我认为这是一个包装。 – RHertel