Rcpp中的元素智能矩阵乘法

时间:2013-11-11 22:14:27

标签: rcpp

我正在研究一种需要逐元素矩阵乘法的代码。我试图在Rcpp中实现这个,因为代码需要一些昂贵的循环。我对Rcpp很新,可能会遗漏一些东西,但我不能让元素明确的矩阵乘法起作用。

// [[Rcpp::export]]

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

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

提前致谢。

2 个答案:

答案 0 :(得分:5)

您可能希望使用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 (or Hadamard) multiplication。在犰狳中,%支持它;请参阅Armadillo docs了解更多信息。

答案 1 :(得分:2)

如果你想伪造它,你可以按照here做什么,并在常规向量上使用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进行矩阵运算。