7

我正在编写一个需要逐元素矩阵乘法的代码。我试图在 Rcpp 中实现这一点,因为代码需要一些昂贵的循环。我对 Rcpp 相当陌生,可能会遗漏一些东西,但我无法让逐元素矩阵乘法工作。

// [[Rcpp::export]]

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

我可能遗漏了一些非常微不足道的东西,并想问是否有任何方法可以做到这一点(除了使用循环迭代每个元素并相乘)。

提前致谢。

4

2 回答 2

6

您可能想使用 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> 

逐元素乘法也称为Schur(或 Hadamard)乘法。在犰狳中,%支持它;有关更多信息,请参阅犰狳文档

于 2013-11-11T22:25:07.470 回答
4

如果你想伪造它,你可以按照这里的做法在常规向量上使用 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) )
*/

但是,正如 Dirk 所说,你最好使用RcppArmadillo矩阵运算。

于 2013-11-12T04:24:10.863 回答