Rcpp中的逐元素矩阵乘法

7

我正在处理需要进行元素级矩阵乘法的代码。由于代码涉及到一些昂贵的循环操作,因此我尝试在Rcpp中实现这个功能。我对Rcpp相对陌生,可能会有所遗漏,但是我目前无法使元素级矩阵乘法正常工作。

// [[Rcpp::export]]

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

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

提前感谢。


为了补充已经回答的内容。https://github.com/RcppCore/Rcpp/issues/20 - Romain Francois
2个回答

7

您可能希望使用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)乘法。在Armadillo中,%支持此操作;请查看Armadillo文档了解更多信息。


感谢您的反馈。自从从Mountain Lion升级到Mavericks以来,我一直在遇到很多错误,这也是我暂时停止使用Armadillo的原因之一。我已经在https://dev59.com/iHnZa4cB1Zd3GeqPkwa6上发布了错误,并使用您发布的解决方案。我已经更新了Makevars并几乎按照网络上的每一个线索进行了跟进,但都没有成功。一旦解决了这个问题,应该就能够使用它了。 - xbsd

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接