利用犰狳的对称性

时间:2019-01-28 13:39:52

标签: c++ rcpp armadillo

有没有办法利用犰狳中所得矩阵是对称的这一事实?我经常使用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))
*/

0 个答案:

没有答案