在 Dirk 的评论基础上,以下是几个案例,演示了 Armadillo 库通过重载的 *
运算符进行矩阵乘法:
#include <RcppArmadillo.h>
arma::mat mm_mult(const arma::mat& lhs,
const arma::mat& rhs)
{
return lhs * rhs;
}
arma::mat vm_mult(const arma::vec& lhs,
const arma::mat& rhs)
{
return lhs.t() * rhs;
}
arma::mat mv_mult(const arma::mat& lhs,
const arma::vec& rhs)
{
return lhs * rhs;
}
arma::mat vv_mult(const arma::vec& lhs,
const arma::vec& rhs)
{
return lhs.t() * rhs;
}
您可以定义一个R函数来分派相应的C++函数:
`%a*%` <- function(x,y) {
if (is.matrix(x) && is.matrix(y)) {
return(.mm(x,y))
} else if (!is.matrix(x) && is.matrix(y)) {
return(.vm(x,y))
} else if (is.matrix(x) && !is.matrix(y)) {
return(.mv(x,y))
} else {
return(.vv(x,y))
}
}
mx <- matrix(1,nrow=3,ncol=3)
vx <- rep(1,3)
my <- matrix(.5,nrow=3,ncol=3)
vy <- rep(.5,3)
而与R的
%*%
函数相比:
R> mx
[,1] [,2] [,3]
[1,] 1.5 1.5 1.5
[2,] 1.5 1.5 1.5
[3,] 1.5 1.5 1.5
R> mx
[,1] [,2] [,3]
[1,] 1.5 1.5 1.5
[2,] 1.5 1.5 1.5
[3,] 1.5 1.5 1.5
##
R> vx
[,1] [,2] [,3]
[1,] 1.5 1.5 1.5
R> vx
[,1] [,2] [,3]
[1,] 1.5 1.5 1.5
##
R> mx
[,1]
[1,] 1.5
[2,] 1.5
[3,] 1.5
R> mx
[,1]
[1,] 1.5
[2,] 1.5
[3,] 1.5
##
R> vx
[,1]
[1,] 1.5
R> vx
[,1]
[1,] 1.5