使用Rcpp的Gram Schmidt正交异构化(行式)

时间:2018-02-27 13:14:03

标签: c++ r rcpp armadillo

我试图获得一个矩阵,该矩阵由基于m×n矩阵的行式归一化正交矢量组成,其中m <1。在R中使用Rcpp不幸的是,我无法弄清楚如何使用R中实现的 qr 方法来实现这一点。

我的尝试紧密遵循标准的Gram-Schmidt正交归一化算法,已经讨论过here。但是,使用Rcpp和Armadillo在这个帖子中提出的方法似乎不再适用。

Matlab中问题的实现由Gary Koop在collection of computer codes

中提供
function [Q] = grams(A)
[m,~] = size(A);

Q=0*A;
% compute QR using Gram-Schmidt
for j = 1:m
   v = A(j,:);
   for i=1:j-1
        v = v - Q(i,:)*A(j,:)'*Q(i,:);
   end
   Q(j,:) = v/norm(v);
end

我目前的Rcpp代码如下:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
SEXP gramscpp(arma::mat A){
  int m = A.n_rows;
  int n = A.n_cols;
  arma::mat Q(m,n); Q.fill(0);

  Q.row(0) = A.row(0)/arma::norm(A.row(0),2);
  for(int j = 1; j < m; j++){
    arma::rowvec v = A.row(j);
    for(int i = 0; i < (j-1); i++){
      v = v - (Q.row(i) * A.row(j).t()) * Q.row(i);
    }
    Q.row(j) = v/arma::norm(v,2);
  }
  return Rcpp::wrap(Q);
}

当模拟随机m-by-n矩阵并应用算法时,不会发生错误。但是,结果矩阵乘以其转置不会产生单位矩阵,我无法识别错误。

0 个答案:

没有答案