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

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

// [[Rcpp::export]]

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

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

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

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 для получения дополнительной информации.

Если вы хотите подделать его, вы можете следить за тем, что здесь сделано, использовать сахар 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 для матричных операций.

Другие вопросы по тегам