You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

特征值与特征向量计算中deflation方法代码仅返回首个特征值问题咨询

代码问题定位

  • 幂法迭代初始向量未重置:你在全局初始化了X变量,第一轮迭代结束后X存储的是首个特征向量,后续迭代没有重置X为随机初始值,进入下一轮幂法循环时,Y/norm(Y)和X/norm(X)的差直接满足精度要求,幂法循环完全不执行,因此每轮都返回第一轮的特征向量,无法计算后续特征值。
  • 左特征向量迭代初始值未重置:XG同样在全局初始化,求当前特征值对应左特征向量的幂法循环,除了第一轮外后续都不会执行,得到的左特征向量完全错误,导致Wielandt收缩步骤失效,收缩后的矩阵并没有移除当前已计算的特征值,后续迭代自然无法得到下一个最大特征值。
  • 非零索引变量j未重置:j在全局初始化为1,第一轮找到第一个非零元素的索引后,后续迭代不会重置j,如果新的特征向量对应j位置的元素为0,特征值计算步骤会直接跳过,Vp对应位置会保留初始值0,出现错误结果。
  • 特征值计算逻辑可优化:用对应位置元素相除求特征值的稳定性差,替换为瑞利商计算可以避免查找非零索引的步骤,同时计算精度更高。

修正后代码

function [Vect,Vp]=PID(A,precision)
    nbVal= 50;
    [n,m]=size(A);
    max_iter = min(nbVal,n);
    Vect=zeros(n,max_iter);
    Vp=zeros(1,max_iter);
    
    for i=1:max_iter
        % 每轮幂法前重置右特征向量初始值
        X = rand(n,1);
        Y = A*X;
        % 幂法求当前最大特征值对应的右特征向量
        while (max(abs(Y/norm(Y)-X/norm(X)))>=precision)
            X=Y/norm(Y);
            Y=A*X;
        end
        Vect(:,i)=X;
        % 用瑞利商计算特征值,稳定性更强
        Vp(1,i) = (X'*A*X)/(X'*X);
        
        % 重置左特征向量初始值
        XG = rand(1,n);
        YG = XG*A;
        % 求当前特征值对应的左特征向量
        while (max(abs(YG/norm(YG)-XG/norm(XG)))>=precision )
            XG=YG/norm(YG);
            YG=XG*A;
        end    
        % Wielandt收缩,移除当前已计算的最大特征值
        A = A - Vp(1,i)*(X*XG)/(XG*X);
    end
end

内容的提问来源于stack exchange,提问作者Yassine_klk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:54:05