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

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

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函数的帮助中,点积的结果与顺序有关,因此不能够随意。
当顺序修改正确后,复数矩阵的正交化就正常了,结果正确。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容