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