有没有办法利用犰狳中所得矩阵是对称的这一事实?我经常使用A * B * A.t()
形式的乘积(其中B
是对称且正定的),我想知道是否有某种方法可以利用这一事实来更快地进行乘法运算。我做了一些简单的尝试,但它们的速度或快或慢。看到一个可以提高速度的功能(或解释为什么无法获得一个速度)会很有趣。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat m1(const arma::mat & A, const arma::mat & B) {
arma::mat C = (A * B) * A.t();
return C;
}
// [[Rcpp::export]]
arma::mat m2(const arma::mat & A, const arma::mat & B) {
arma::mat C1 = (A * B);
arma::mat C2 = arma::mat(arma::size(C1), arma::fill::zeros);
arma::uword n = C1.n_rows;
for (arma::uword i = 0; i < n; i++) {
for (arma::uword j = 0; j <= i; j++) {
C2(i, j) = arma::as_scalar(C1.row(i) * A.row(j).t());
}
}
C2 = arma::symmatl(C2);
return C2;
}
// [[Rcpp::export]]
arma::mat m3(const arma::mat & A, const arma::mat & B) {
arma::mat C1 = (A * B);
arma::mat C2 = arma::mat(arma::size(C1), arma::fill::zeros);
arma::uword n = C1.n_rows;
for (arma::uword i = 0; i < n; i++) {
for (arma::uword j = 0; j <= i; j++) {
C2.submat(i, j, i, j) = C1.row(i) * A.row(j).t();
}
}
C2 = arma::symmatl(C2);
return C2;
}
/*** R
n <- 10
A <- matrix(rnorm(n*n), n, n)
B <- crossprod(matrix(rnorm(n*n), n, n))
microbenchmark::microbenchmark(m1(A, B), m2(A, B), m3(A, B))
all.equal(m1(A, B), m2(A, B))
all.equal(m1(A, B), m3(A, B))
*/