Поэлементное умножение матриц в 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
для матричных операций.