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

标签 matlab linear-algebra eigenvalue eigenvector diagonal

我正在寻找在 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/

    相关文章:

    arrays - Matlab代码性能提升

    Matlab将幅度和角度转化为复数

    python - 使用 numpy.meshgrid 定义二次函数

    algorithm - 对于整数 A>0、B>0、N>0,找到整数 x>0、y>0,使得 N-(Ax+By) 是最小的非负数

    matlab - 在有限域域中查找 A.x = b 中 x 的 "all solutions"

    python - 使用ARPACK求解特征值问题,但与Matlab得到的结果不一致

    python - 是否值得将 IPython 与 scipy 的 eig 并行使用?

    matlab - 在 MATLAB 中对球体表面的一个子集进行着色

    matlab - 获取对称矩阵的特征值和特征向量的简单Lanczos算法代码

    c++ - 在 C/C++ 程序中使用 Matlab 元胞数组