本文介绍了如何求两个特征值不同的矩阵的公共特征向量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找或更确切地说在2个矩阵AB之间建立公共特征向量矩阵X,例如:

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 = P D P^-1

定义的最终期望自同态F时具有有效的结果

我还阅读了wikipedia topic和Thisinteresting 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中总结,就像它是一个原型一样,如果它起作用了,然后寻找用MKL或Python函数进行这种合成。因此,还标记了蟒蛇。

如何构建这些公共特征向量并找到相关的特征值?我对所有可能存在的实现它的方法感到有点迷茫。

下面的屏幕截图显示,换向器的内核必须不同于空向量:

编辑1:根据数学交换,建议对交换器[A,B]使用奇异值分解(SVD),即在MatLab中使用:

如果𝑣是公共特征向量,则‖(𝐴𝐵−𝐵𝐴)𝑣‖=0。奇异值分解方法给出一个单位向量𝑣,它最小化‖(𝐴𝐵−𝐵𝐴)𝑣‖(约束条件为‖𝑣‖=1)

所以我从:

中提取近似特征向量V
[U,S,V] = svd(A*B-B*A)

是否有方法可以提高精度以尽可能地将‖(𝐴𝐵−𝐵𝐴)𝑣‖降至最低?

重要提示:可能你们中的一些人没有完全理解我的目标。

关于特征向量的公共基,我正在寻找V1V2的组合(向量或矩阵),或者直接在两个输入Fisher大理数上使用null运算符来构建这个新的基&p&q;其中,与已知的D1D2(标记为D1aD2a)之外的其他特征值,我们可以得到:
F = P (D1a+D2a) P^-1

要计算新的Fisher矩阵F,我需要知道P,假设D1aD2a分别等于D1D2对角矩阵(来自AB矩阵的对角化)

如果我知道特征向量P的公基,我可以从D1D2推导出D1aDa2,不是吗?

以下链接提供了两个Fisher矩阵:

Matrix A

Matrix B

推荐答案

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

步骤概述:

  1. 分别获取A和B的特征向量/值。

  2. 将生成的特征向量按其特征空间分组。

  3. 通过一次检查一对特征空间的特征向量之间的线性相关性来检查特征空间的交集。

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列的跨度组成,第二个空间也是如此。

如何求两个集合的线性交集(跨度)

要完成查找公共特征向量的任务,您可以对AB执行上述操作。接下来,对于每对特征空间,检查线性相关性。如果存在线性依赖关系,则线性交集是答案。

有许多方法可用于检查线性相关性。一是用别人的工具。示例:https://www.mathworks.com/matlabcentral/fileexchange/32060-intersection-of-linear-subspaces

一种是按列连接列向量形成的矩阵的RREF

假设您在步骤2中进行了计算,得出AV1, D1, d1, W1, ia1BV2, D2, d2, W2, ia2。您需要

for i=1:numel(ia1)
    for j=1:numel(ia2)
         check_linear_dependency(col1,col2);
    end
end
其中col1是步骤2中提到的W1(:,ia1(i):ia1(i+1)-1),但最后一个空格有警告,col2check_linear_dependency类似,我们指的是以下内容。首先,我们获得RREF:

[R,p] = rref([col1,col2]);
首先,您要查找的是rank([col1,col2])<size([col1,col2],2)。如果你已经计算了rref,那么你已经有了排名。详情可查看MatLabdocumentation。您需要分析您的代码以选择更有效的方法。我将避免猜测rank()中的MatLab做了什么。虽然做rank()是否意味着做rref中的工作可以做好单独的问题。

rank([col1,col2])<size([col1,col2],2)true的情况下,某些行没有前导1,我相信p将帮助您追溯到哪些列依赖于其他哪些列。你可以从这里建立互联系统。像往常一样,要警惕==语句中出现的数字错误。我们正谈到一个不同的问题--即。如何在MatLab中从rref()得到线性交集,所以我将把它留在这里。

还有另一种使用fundamental theorem of linear algebra的方法(*叹息那个不幸的命名):

null( [null(col1.').' ; null(col2.').'] )

我从here得到的公式。我认为ftla就是它应该奏效的原因。如果这不是原因,或者如果您想确保公式有效(您可能应该这样做),请单独提出问题。请注意,纯粹的数学题应该放在不同的StackExchange网站上。


现在我想我们完了!


编辑1:

让我们特别清楚ia是如何使用一个示例的。假设我们使用A的后缀1B的后缀2来命名所有对象。我们需要

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),也应该执行相同的操作。

当然,由于手头有多种方法,最好跨方法比较结果。

这篇关于如何求两个特征值不同的矩阵的公共特征向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 21:53