基于施密特正交法的矩阵QR分解

版权声明:<–本博客所有内容均为自己在学习工作中的总结、摘录等-- --转载请注明出处-- --如有侵权请联系删除–>https://blog.csdn.net/ai359005521/article/details/85252406

(1)对向量进行施密特正交化:
function B = schimidt(A)
% function:对A的列向量进行规范正交化
fprintf("对向量进行施密特正交化\n");
%将矩阵A中的行和列分别赋值给变量row和col
[row,col] = size(A);  
%判断矩阵中的行和列是不是相同       
if row < col
    fprintf('行数小于列数,不能规范正交化!\n');
    return;
end
%初始化一个行和列与矩阵A相同的零矩阵B
B = zeros(row,col);
%将矩阵A的第一列赋值给矩阵B的第一列,即β1=α1
B(:,1) = A(:,1);
%分别算出β1、β2、β3…
for i = 1:col
    B(:,i) = A(:,i);
    for j = 1:i - 1
        B(:,i) = B(:,i) - (A(:,i)'*B(:,j))/(B(:,j)'*B(:,j)) * B(:,j);
    end
end
(2)对向量进行标准化
function Q = normalization( B )
fprintf("对向量进行标准化,求Q矩阵\n");
%将矩阵B中的行和列分别赋值给变量row和col
[row,col] = size(B);
%初始化一个行和列与矩阵A相同的零矩阵Q
Q = zeros(row,col);
%分别对β1、β2、β3…进行标准化得到γ1、γ2、γ3…
for i = 1:col
    % norm(B(:,i))指第i列向量的欧式距离
    Q(:,i) = B(:,i)/norm(B(:,i));
end
(3)求对角线矩阵
function L = diagonal_line( B )
fprintf("求对角线矩阵L\n");
[row,col] = size(B);
%先初始化一个和矩阵B相同的零矩阵
L = zeros(row,col);
%将第i列向量的欧式距离赋值给矩阵L中的第i行和第i列个元素
for i=1:col
     p=0;
    for j=1:row
       p=p+(B(row*(i-1)+j))^2;     
%        fpLintf("%4.7f",p);
    end
       t=p^(1/2);
    L((i-1)*row+i)=t;
end
 (4)求上三角矩阵
function T = solveplitri( A,B )
fprintf("求上三角矩阵T\n");
[row,col] = size(B);
T = zeros(row,col);
%将矩阵T中的对角线上的元素都赋为1
    for i = 1:row
        for j=1:col
            while(i==j)
                T(row*(i-1)+j)=1;
                break;
            end
        end
end
	%对对角线上面的元素进行初始化
    for i = 1:(row-1)
        for j = 1:i
            T(i*row+j)=(A(:,(i+1)))'*(B(:,j))/((B(:,j))'*(B(:,j)));
            
        end
    end
 (5)求R矩阵
function R = slover( L,T )
    fprintf("求R矩阵\n");
            R = L *T;

运行结果
基于施密特正交法的矩阵QR分解_第1张图片

你可能感兴趣的:(矩阵分析)