gpt4 book ai didi

python - 如何找到具有不同特征值的两个矩阵的公共(public)特征向量

转载 作者:行者123 更新时间:2023-12-04 11:03:06 24 4
gpt4 key购买 nike

我正在寻找或构建 2 个矩阵之间的公共(public)特征向量矩阵 X AB如 :

AX=aX with "a" the diagonal matrix corresponding to the eigenvalues

BX=bX with "b" the diagonal matrix corresponding to the eigenvalues
哪里 AB是方阵和可对角化矩阵。
我看了一下 a similar post但还没有得出结论,即当我构建最终想要的内同态时得到有效的结果 F定义者: F = P D P^-1我还阅读了 wikipedia topic而这个 interesting paper但不必提取很容易实现的方法。
特别是,我对 eig(A,B) 感兴趣MATLAB 函数。
我试着像这样使用它:
% Search for common build eigen vectors between FISH_sp and FISH_xc
[V,D] = eig(FISH_sp,FISH_xc);
% Diagonalize the matrix (A B^-1) to compute Lambda since we have AX=Lambda B X
[eigenv, eigen_final] = eig(inv(FISH_xc)*FISH_sp);
% Compute the final endomorphism : F = P D P^-1
FISH_final = V*eye(7).*eigen_final*inv(V)
但是矩阵 FISH_final不要给出好的结果,因为我可以从这个矩阵中进行其他计算 FISH_final (这实际上是一个 Fisher 矩阵)并且这些计算的结果是无效的。
所以可以肯定,我一定在上面的代码片段中犯了一个错误。第一次,我更喜欢在 Matlab 中得出结论,就好像它是一个原型(prototype)一样,如果它有效,则寻找使用 MKL 或 Python 函数进行这种综合。因此也标记python。
如何构建这些常见的特征向量并找到相关的特征值?我对现有的所有执行它的潜在方法有点迷茫。
下面的屏幕截图显示了换向器的内核必须与空向量不同:
Eigen vectors common and kernel of commutator
编辑 1:从数学交流中,有人建议在换向器 [A,B] 上使用奇异值分解 (SVD),这是在 Matlab 中执行的操作:
“如果𝑣是一个共同的特征向量,那么‖(𝐴𝐵−𝐵𝐴)𝑣‖=0。SVD方法给你一个单位向量𝑣,它最小化‖(𝐴𝐵-𝐵𝐴)𝑣‖(约束条件为‖1 )”
所以我从 中提取近似特征向量 V:
[U,S,V] = svd(A*B-B*A)
有没有办法提高准确率以尽可能减少 ‖(𝐴𝐵−𝐵𝐴)𝑣‖ ?
重要说明:也许你们中的一些人没有完全理解我的目标。
关于特征向量的公共(public)基础,我正在寻找 V1 的组合(向量或矩阵)和 V2 ,或直接使用 null 2 个输入 Fisher marices 上的运算符,以构建这个新的基础“P”,其中,其他特征值不是已知的 D1D2 (注意 D1aD2a ),我们可以有:
F = P (D1a+D2a) P^-1
要计算新的 Fisher 矩阵 F,我需要知道 P ,假设 D1aD2a分别等于 D1D2对角矩阵(来自 AB 矩阵的对角化)
如果我知道特征向量的公共(public)基础 P ,我可以推断出 D1aDa2来自 D1D2 ,不能吗?
2个Fisher矩阵可在这些链接上找到:
Matrix A
Matrix B

最佳答案

我认为 Matlab 中没有用于计算两个矩阵的公共(public)特征值的内置工具。我将概述蛮力方法并在 Matlab 中进行,以突出显示其与特征向量相关的一些方法。我们将假设矩阵 A 和 B 是正方形且可对角化的。
步骤概要:

  • 分别获取 A 和 B 的特征向量/值。
  • 按其特征空间对结果特征向量进行分组。
  • 通过一次检查 A 和 B 一对特征空间的特征向量之间的线性相关性来检查特征空间的交集。

  • Matlab 确实提供了(有效地)完成每一步的方法!当然,步骤 3 涉及多次检查线性相关性,这反过来意味着我们可能会进行不必要的计算。更不用说,找到共同的特征向量可能不需要找到所有的特征向量。所以这并不是一个通用的数字配方。
    如何获得特征向量/值
    语法是
    [V,D] = eig(A)
    哪里 D(i), V(:,i)是对应的特征对。
    只是要警惕数字错误。换句话说,如果你检查
    tol=sum(abs(A*V(:,i)-D(i)*V(:,i)));
    tol<n* eps 对于一些小 n应该是真的对于较小的矩阵 A,但对于 0 或 1 可能不是真的。
    例子:
    >> A = gallery('lehmer',4);
    >> [V,D] = eig(A);
    >> sum(abs(A*V(:,1)-D(1)*V(:,1)))<eps
    ans =
    logical
    0
    >> sum(abs(A*V(:,1)-D(1)*V(:,1)))<10*eps
    ans =
    logical
    1
    如何按特征空间对特征向量进行分组
    在 Matlab 中,特征值不会在 [V,D] = eig(A) 的输出中自动排序.所以你需要这样做。
  • 获取矩阵的对角线项:diag(D)
  • 排序并跟踪排序所需的排列:[d,I]=sort(diag(D))
  • 识别 d 中的重复元素:[~,ia,~]=unique(d,'stable')
  • ia(i)告诉你 i 的开始索引本征空间。所以你可以期待 d(ia(i):ia(i+1)-1)是相同的特征值,因此属于 i 的特征向量特征空间是列 W(:,ia(i):ia(i+1)-1)哪里 W=V(:,I) .当然,最后一个的索引是 ia(end):end最后一步恰好回答了 here在真正的普遍性。在这里, unique至少对于小型 A 来说已经足够了.
    (请随意提出一个单独的问题,了解如何有效地执行“基于另一个对角矩阵对一个矩阵的列进行混洗”的整个步骤。可能还有其他使用内置 Matlab 函数的有效方法。)
    例如,
    >> A=[1,2,0;1,2,2;3,6,1];
    >> [V,D] = eig(A),
    V =
    0 0 0.7071
    1.0000 -0.7071 0
    0 0.7071 -0.7071
    D =
    3 0 0
    0 5 0
    0 0 3
    >> [d,I]=sort(diag(D));
    >> W=V(:,I),
    W =
    0 0.7071 0
    1.0000 0 -0.7071
    0 -0.7071 0.7071
    >> [~,ia,~]=unique(d,'stable'),
    ia =
    1
    3
    这是有道理的,因为第一个特征空间是特征值 3 的特征空间,包括 W 的第 1 列和第 2 列的跨度,对于第二个空间也类似。
    如何获得两组(的跨度)的线性交集
    要完成寻找共同特征向量的任务,您可以对 A 执行上述操作和 B .接下来,对于每对特征空间,检查线性相关性。如果存在线性相关性,则线性相交是一个答案。
    有多种方法可以检查线性相关性。一是使用别人的工具。示例: https://www.mathworks.com/matlabcentral/fileexchange/32060-intersection-of-linear-subspaces
    一是获取 RREF通过逐列连接列向量形成的矩阵。
    假设您在第 2 步中进行了计算并得出了 V1, D1, d1, W1, ia1AV2, D2, d2, W2, ia2B .你需要做
    for i=1:numel(ia1)
    for j=1:numel(ia2)
    check_linear_dependency(col1,col2);
    end
    end
    哪里 col1W1(:,ia1(i):ia1(i+1)-1)如步骤 2 中所述,但对最后一个空格有警告, col2 类似。来自 check_linear_dependency我们的意思是以下内容。首先我们得到 RREF:
    [R,p] = rref([col1,col2]);
    您首先要找的是 rank([col1,col2])<size([col1,col2],2) .如果您计算过 rref不管怎样,你已经有了排名。您可以查看Matlab documentation详情。您将需要分析您的代码以选择更有效的方法。我将避免猜测估计 Matlab 在 rank() 中的作用.虽然是否在做 rank()意味着在 rref 中进行工作可以提出一个很好的单独问题。
    rank([col1,col2])<size([col1,col2],2) 的情况下是 true ,有些行没有前导 1,我相信 p将帮助您追溯哪些列依赖于哪些其他列。你可以从这里建立相交。像往常一样,注意数值错误会妨碍 ==声明。我们正在讨论一个不同的问题——即。如何从 rref() 获得线性相交在 Matlab 中,所以我将把它放在这里。
    还有另一种使用 fundamental theorem of linear algebra 的方法(*感叹那个不幸的命名):
    null( [null(col1.').' ; null(col2.').'] )
    我从 here 得到的公式.我认为 ftla 是它应该起作用的原因。如果这不是原因,或者如果您想确保公式有效(您可能应该这样做),请提出一个单独的问题。请注意,纯粹的数学问题应该在不同的 stackexchange 站点上进行。

    现在我想我们已经完成了!

    编辑 1:
    让我们更清楚如何 ia与一个例子一起工作。假设我们用结尾 1 命名所有内容为 A2B .我们需要
    for i=1:numel(ia1)
    for j=1:numel(ia2)
    if i==numel(ia1)
    col1 = W1(:,ia1(end):end);
    else
    col1 = W1(:,ia1(i):ia1(i+1)-1);
    end
    if j==numel(ia2)
    col2 = W2(:,ia2(j):ia2(j+1)-1);
    else
    col2 = W2(:,ia2(end):end);
    end
    check_linear_dependency(col1,col2);
    end
    end

    编辑2:
    我应该提到共同特征向量应该是那些在换向器零空间中的观察结果。因此,也许 null(A*B-B*A)产生相同的结果。
    但仍然要警惕数字错误。使用蛮力法,我们从低 tol 的特征对开始。 (参见前面部分的定义)所以我们已经验证了特征向量中的“特征”部分。与 null(A*B-B*A) ,也应该这样做。
    当然,手头有多种方法,比较不同方法的结果是个好主意。

    关于python - 如何找到具有不同特征值的两个矩阵的公共(public)特征向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65548452/

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