程序:
%% 基于Gram-Schmidt的QR分解
function [Q,R] = myself_qr(A)
[m, n] = size(A);
if rank(A)~=n
error('该矩阵无法进行进行基于Gram-Schmidt的QR分解!'); %检测参数异常,停止程序
end
Q = zeros( m, n );
R = zeros( n, n );
R(1,1)= norm( A( :, 1) );
Q(:, 1) = A( :, 1)/R( 1, 1 );
for k = 2: n
for j = 1: k - 1
R( j, k ) = Q( :, j )' * A( :, k);
end
q = zeros( m, 1 );
for j = 1: k - 1
q = Q( :, j) * R( j, k ) + q;
end
R( k, k ) = norm( A( :, k ) - q );
Q( :, k ) = ( A( :, k) - q ) / R( k, k );
end
测试程序:
clc;
clear;
A=rand(4,3);
[Q R]=qr(A);
[Q1 R1]=myselfqr(A);
fprintf('qr函数QR结果:\n');
Q*R-A
fprintf('myselfqr函数QR结果:\n');
Q1*R1-A
结果: