gpt4 book ai didi

matlab - 求解广义特征向量和特征值以获得公共(public)基础

转载 作者:行者123 更新时间:2023-12-04 13:29:42 25 4
gpt4 key购买 nike

我正在寻找在 Matlab 中解决广义特征向量和特征值问题。为此,我测试了 2 种方法。

  • 如果广义问题被公式化为:

  • generalized problem
    然后,我们可以在每一边乘以 B^(-1),例如:
    other formulation
    所以,从理论上讲,这是一个简单而经典的特征值问题。
    最后,在 Matlab 中,我简单地使用了 A=FISH_spB=FISH_xc :
    [Phi, Lambda] = eig(inv(FISH_xc)*FISH_sp);
    但是当我在一个简单的 Fisher 合成之后做出的结果是不正确的(约束条件太差,并且还出现了 nan 值。我不知道为什么我没有得到与下面第二个相同的结果。
  • 第二种方法来自以下paper .

  • 总而言之,所使用的算法在第 7 页中进行了描述。我遵循了该算法的所有步骤,并且在进行 Fisher 合成时似乎得到了更好的结果。
    这里是感兴趣的部分(抱歉,我认为 stakoverflow 上没有 Latex ):
    description of generalized eigenvectors and eigenvalues
    这是我用于此方法的小 Matlab 脚本:
    % Diagonalize A = FISH_sp and B = Fish_xc
    [V1,D1] = eig(FISH_sp);
    [V2,D2] = eig(FISH_xc);

    % Applying each step of algorithm 1 on page 7
    phiB_bar = V2*(D2.^(0.5)+1e-10*eye(7))^(-1);
    barA = inv(phiB_bar)*FISH_sp*phiB_bar;
    [phiA, vA] = eig(barA);
    Phi = phiB_bar*phiA;
    所以最后,我找到了 phi 特征向量矩阵 (phi) 和 lambda 对角矩阵 (D1)。
  • 现在,我想将这个广义问题与 A 和 B 矩阵(分别是 Fish_sp 和 Fish_xc)之间的最终公共(public)特征向量联系起来。有没有办法执行此操作?

  • 确实,我到现在所做的就是找到 A*Phi之间的平行关系。和 B*Phi , 由 Lambda 对角矩阵链接 .也许,我们可以这样安排这种关系:
    A*Phi'=Phi'*Lambda_A'
    B*Phi'=Phi'*Lambda_B'
  • 从数值的角度来看,为什么我在 1) 中的方法和 3) 中的方法之间没有得到相同的结果?我的意思是关于 Phi特征向量矩阵和 Lambda对角矩阵。

  • 然而,这是相同的公式。
    编辑:
    如果我想说 ,我会得到错误的结果phi 对角化 A=FISH_sp 和 B=FISH_xc 矩阵。
    事实上,通过这样做:
    % Marginalizing over uncommon parameters between the two matrices
    COV_GCsp_first = inv(FISH_GCsp);
    COV_XC_first = inv(FISH_XC);
    COV_GCsp = COV_GCsp_first(1:N,1:N);
    COV_XC = COV_XC_first(1:N,1:N);
    % Invert to get Fisher matrix
    FISH_sp = inv(COV_GCsp);
    FISH_xc = inv(COV_XC);
    % Diagonalize
    [V1,D1] = eig(FISH_sp);
    [V2,D2] = eig(FISH_xc);

    % Build phi matrix
    % V2 corresponds to eigen vectors of FISH_xc
    phiB_bar = V2*diag(diag(D2.^(-0.5)));
    % DEBUG : check identity matrix => OK, Identity matrix found !
    id = (phiB_bar')*FISH_xc*phiB_bar
    % phi matrix
    barA = (phiB_bar')*FISH_sp*phiB_bar
    [phiA, vA] = eig(barA);
    phi = phiB_bar*phiA;

    % Check eigen values : OK, columns of eigenvalues found !
    FISH_sp*V1./V1
    % Check eigen values : OK, columns of eigenvalues found !
    FISH_xc*V2./V2

    % Check if phi diagolize FISH_sp : NOT OK, not identical eigenvalues
    FISH_sp*phi./phi
    % Check if phi diagolize FISH_sp : NOT OK, not identical eigenvalues
    FISH_xc*phi./phi
    所以,我没有找到特征向量矩阵 Phi对角化 A 和 B,因为预期的特征值不是相同值的列。
    顺便说一下,我找到了特征值 D1D2来自(哪里 :
    [V1,D1] = eig(FISH_sp);
    [V2,D2] = eig(FISH_xc);

    % Check eigen values : OK, columns of eigenvalues D1 found !
    FISH_sp*V1./V1
    % Check eigen values : OK, columns of eigenvalues D2 found !
    FISH_xc*V2./V2
    我怎么能解决这个错误的结果(我说的是比率:
    FISH_sp*phi./phi
    FISH_xc*phi./phi
    对于给定的 FISH_sp 列没有给出相同的值和 FISH_xc )
    )
    ??在论文中,他们说 phi对角化 A=FISH_spB=FISH_xc但我无法重现它。
    如果有人能看到我的错误在哪里......

    最佳答案

    您定义了 barA = inv(phiB_bar)*FISH_sp*phiB_bar .从方程。 (39) 在手稿中它看起来应该是 barA = transpose(phiB_bar)*FISH_sp*phiB_bar反而。
    此外,您的方法 1 在 B 时失败是单数(逆不存在)。 MATLAB 的 eig(A,B)但是也应该处理单数 B如果我没记错的话。

    关于matlab - 求解广义特征向量和特征值以获得公共(public)基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65868442/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com