我正在研究一种需要逐元素矩阵乘法的代码。我试图在Rcpp中实现这个,因为代码需要一些昂贵的循环。我对Rcpp很新,可能会遗漏一些东西,但我不能让元素明确的矩阵乘法起作用。
// [[Rcpp::export]]
NumericMatrix multMat(NumericMatrix m1, NumericMatrix m2) {
NumericMatrix multMatrix = m1 * m2 // How can this be implemented ?
}
我可能会遗漏一些非常微不足道的东西,并想问是否有任何方法可以做到这一点(除了使用循环迭代每个元素并乘以)。
提前致谢。
答案 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
进行矩阵运算。