Matlab 矩阵论 矩阵分解的计算实现(六)矩阵的正交三角分解

Matlab 矩阵论 矩阵分解的计算实现(六)矩阵的正交三角分解

本来matlab中自带了做正交三角分解的函数,[U,R]=qr(A),U R为分解结果。但是这样使用只会有结果没有中间过程,所以写了一个施密特正交化函数,可以显示中间做题的过程。
这个函数没法计算有复数的矩阵,如果计算复数直接调用qr()函数即可。

代码

%矩阵的正交三角分解(UR分解)
%获得的beta1 要检查可能不对
A=[1 2 0;1 0 -1; 0 1 -1];
disp("原始矩阵")
disp(sym(A));
%采用列正交化
U= schmidt(sym(A));
disp("施密特正交化得矩阵U")
disp(sym(U))
R = U^-1 *A;
disp("矩阵R = U^-1 *A")
disp(sym(R))
%如果矩阵带复数 就用下面方法计算
% [U,R]=qr(A);
% disp("矩阵U")
% disp(U);
% disp("矩阵R")
% disp(R);
% 以下是函数块
function answer=schmidt(matrixIn,transpose)
% 默认取矩阵列向量为待正交化向量, 
% 如 A=[1,-1,4;2,3,-1;-1,1,0]
% 则待正交化向量为 [-1,2,1], [-1,3,1], [4,-1,0]
% 函数调用方式为 schmidt(A)
if nargin>1
    % 如果要求取矩阵行向量为待正交化向量
    % 函数调用方式为 schmidt(A,1)
    % 但是注意: 得到的结果矩阵仍然是列向量为正交化之后的向量
    if transpose==1
       matrixIn=matrixIn';
    end
end
answer=zeros(size(matrixIn));
answer(:,1)=matrixIn(:,1);
disp("β1");
disp(sym(answer(:,1)))
if size(matrixIn,2)>1
    for column=1:size(matrixIn,2)
        %正交化
        for beta=1:column-1
            answer(:,column)=answer(:,column)-dot(matrixIn(:,column),answer(:,beta))/dot(answer(:,beta),answer(:,beta))*answer(:,beta);
        end
        answer(:,column)=answer(:,column)+matrixIn(:,column);
        if column>=2
            disp("β"+column);
            disp(sym(answer(:,column)));
        end
        
        %单位化
        answer(:,column)=answer(:,column)/sqrt(sum(answer(:,column).^2));
        disp("ε"+column);
        disp(sym(answer(:,column)))
    end
end
end

运行结果

Matlab 矩阵论 矩阵分解的计算实现(六)矩阵的正交三角分解_第1张图片Matlab 矩阵论 矩阵分解的计算实现(六)矩阵的正交三角分解_第2张图片

源码

你可能感兴趣的:(Matlab,矩阵论,矩阵分析计算实现,matlab,矩阵,线性代数)