复数矩阵进行施密特正交化时遇到的问题

先放正确的代码,供需要的人可以直接使用:

function [OrthMatrix] = SchmidtOrthogonalization(in)
% Schmidt Orthogonalization
% 施密特正交化,将输入矩阵进行正交单位化

[~,n] = size(in);
% Init OrthMatrix
OrthMatrix = zeros(size(in));
OrthMatrix(:,1) = in(:,1);

% Orthogonalization
for k=2:n
    for t=1:k-1
        OrthMatrix(:,k) = OrthMatrix(:,k) - dot(OrthMatrix(:,t), in(:,k))/dot(OrthMatrix(:,t),OrthMatrix(:,t))*OrthMatrix(:,t);
    end
    OrthMatrix(:,k) = OrthMatrix(:,k) + in(:,k);
end

% Normalization
for k=1:n
    OrthMatrix(:,k) = OrthMatrix(:,k)/norm(OrthMatrix(:,k), 'fro');
end

end

在刚开始进行代码编写时,遇到了结果不正确,正交化后的矩阵乘积不是单位阵,最初以为是复数矩阵不适用于施密特正交化。但是,在百度搜索很久没有发现有人提及复数矩阵的施密特正交化,不知道是不是大家都不需要对复数矩阵进行正交化。
最初写代码时,我直接参考的是这里MATLAB中施密特正交化的实现 - Martin_Soaring - 博客园 (cnblogs.com)。
当我单步调试时发现了问题,问题在于下面一行代码

OrthMatrix(:,k) = OrthMatrix(:,k) - dot(OrthMatrix(:,t), in(:,k))/dot(OrthMatrix(:,t),OrthMatrix(:,t))*OrthMatrix(:,t);

对比我参考的代码,第一个求点积函数的输入变量位置不同,本页我放的代码中点积是未正交化的向量与正交化的向量求点积,我参考的代码中实现顺序是相反的,正交化的向量与为正交化的向量求点积。当矩阵是实数矩阵时,顺序不同无所谓,正交化的结果是正确的。但是,当矩阵是复数是,参考dot函数的帮助中,点积的结果与顺序有关,因此不能够随意。
当顺序修改正确后,复数矩阵的正交化就正常了,结果正确。

你可能感兴趣的:(复数矩阵进行施密特正交化时遇到的问题)