Поэлементное матричное умножение в Rcpp

Я работаю над кодом, который требует поэлементного матричного умножения. Я пытаюсь реализовать это в Rcpp, так как код требует некоторых дорогостоящих циклов. Я новичок в Rcpp и, возможно, что-то упускаю, но я не могу заставить работать поэлементное матричное умножение.

// [[Rcpp::export]]

NumericMatrix multMat(NumericMatrix m1, NumericMatrix m2) {
    NumericMatrix multMatrix = m1 * m2 // How can this be implemented ?
}

Возможно, я упустил что-то очень тривиальное и хотел спросить, есть ли какой-нибудь способ сделать это (кроме использования циклов для перебора каждого элемента и умножения).

Заранее спасибо.


person xbsd    schedule 11.11.2013    source источник
comment
В дополнение к тому, что было отвечено. github.com/RcppCore/Rcpp/issues/20   -  person Romain Francois    schedule 12.11.2013


Ответы (2)


Вы, вероятно, захотите использовать RcppArmadillo (или RcppEigen) для реальной математики на матрицах.

R> library(RcppArmadillo)
R> cppFunction("arma::mat schur(arma::mat& a, arma::mat& b) { 
+                   return(a % b); }", depends="RcppArmadillo")
R> schur(matrix(1:4,2,2), matrix(4:1,2,2))
     [,1] [,2]
[1,]    4    6
[2,]    6    4
R> 

Поэлементное умножение также называется умножением Шура (или Адамара). В Armadillo его поддерживает %; см. документы Armadillo для получения дополнительной информации.

person Dirk Eddelbuettel    schedule 11.11.2013
comment
Спасибо за ответ. Я получаю много ошибок в Mavericks с тех пор, как обновился с Mountain Lion, и это была одна из причин, по которой я временно перестал использовать Armadillo. Я разместил сообщение об ошибке в stackoverflow .com/questions/19920281/, используя опубликованное вами решение. Я обновил Makevars и следил почти за всеми указаниями в сети, но безрезультатно. Должен быть в состоянии использовать его, как только это будет решено. - person xbsd; 12.11.2013

Если вы хотите подделать его, вы можете следовать тому, что сделано здесь, и использовать сахар Rcpp на обычные векторы и преобразовать их в матрицы по мере необходимости:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector multMat(NumericMatrix m1, NumericMatrix m2) {
  NumericVector multMatrix = m1 * m2;
  multMatrix.attr("dim") = Dimension(m1.nrow(), m1.ncol());
  return multMatrix;
}

/*** R
multMat( matrix(1:9, nrow=3), matrix(1:9, nrow=3) )
*/

Но, как сказал Дирк, вам лучше использовать RcppArmadillo для матричных операций.

person Kevin Ushey    schedule 12.11.2013