Zunächst einmal bin ich ein Anfänger Benutzer so vergessen meine allgemeine Ignoranz. Ich suche nach einer schnelleren Alternative zum% *% Operator in R. Obwohl ältere Beiträge die Verwendung von RcppArmadillo andeuten, habe ich 2 Stunden lang versucht, RcppArmadillo ohne Erfolg zu arbeiten. Ich stoße immer auf lexikalische Probleme, die "unerwartete ..." Fehler ergeben. Ich habe die folgende Funktion in RCPP gefunden, die ich tun kann, Arbeit machen:Matrix Multiplikation in 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 ;
}
'
Diese Funktion ist jedoch elementweise Multiplikation durchführt und nicht als% *% verhält. Gibt es eine einfache Möglichkeit, den obigen Code zu ändern, um das gewünschte Ergebnis zu erzielen?
EDIT:
Ich habe mit einer Funktion RcppEigen kommen, das% *% zu schlagen scheint:
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
Der Kommentar ist teilweise falsch in diesen RcppEigen _nicht_ auf einer Systemkopie angewiesen von Eigen, aber bringt seine eigene, ähnlich wie andere R-Pakete tun. –
Ah, danke für die Klarstellung, @DirkEddelbuettel. Gut zu wissen. Ich dachte, es wäre ein Wrapper. – RHertel