我试图获得一个矩阵,该矩阵由基于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矩阵并应用算法时,不会发生错误。但是,结果矩阵乘以其转置不会产生单位矩阵,我无法识别错误。