问题:如何求两个具有不同特征值的矩阵的共同特征向量

我正在寻找或者更确切地说在 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是可对角化的方阵。

我在中查看了一个类似的帖子但没有设法得出结论,即当我构建最终想要的内同态F时具有有效结果:F = P D P^-1

我还阅读了维基百科主题和这篇有趣的论文但不必提取非常容易实现的方法。

特别是,我对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 函数进行此合成。因此也标记python。

如何构建这些常见的特征向量并找到相关的特征值?我有点迷失在现有的所有潜在方法之间。

下面的屏幕截图显示 commutator 的内核必须与空向量不同:

共同特征向量和换向器核

编辑 1: 从数学交流中,一个建议在换向器 [A,B] 上使用奇异值分解 (SVD),即在 Matlab 中通过:

“如果 v 是一个共同的特征向量,那么 ‖(AB−BA)v‖u003d0。SVD 方法为您提供了一个最小化 ‖(AB−BA)v 的单位向量 v(约束条件为 ‖v‖u003d1 )"

所以我从 中提取近似特征向量 V:

[U,S,V] = svd(A*B-B*A)

有没有办法提高准确度以尽可能减少‖(AB−BA)v‖?

重要说明: 也许你们中的一些人没有完全理解我的目标。

关于特征向量的共同基础,我正在寻找V1V2的组合(向量或矩阵),或者直接在 2 个输入 Fisher marices 上使用null运算符,以建立这个新的基础“P”,其中与其他特征值比已知的D1D2(注意D1aD2a),我们可以:

F = P (D1a+D2a) P^-1

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

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

这些链接上提供了 2 个 Fisher 矩阵:

矩阵 A

矩阵 B

解答

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

步骤概要:

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

  2. 根据特征空间对结果特征向量进行分组。

  3. 通过一次检查一对特征空间 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对于较小的矩阵 A 应该是正确的n但对于 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)告诉你ith 特征空间的开始索引。所以你可以期望d(ia(i):ia(i+1)-1)是相同的特征值,因此属于i特征空间的特征向量是W(:,ia(i):ia(i+1)-1)列,其中W=V(:,I)。当然,对于最后一个,索引是ia(end):end

最后一步恰好在这里回答了。在这里,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都执行上述操作。接下来,对于每对特征空间,检查线性相关性。如果存在线性相关性,则线性相交是_an_答案。

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

一种是通过逐列连接列向量得到矩阵的RREF。

假设您在步骤 2 中进行了计算,并针对AB得出V1, D1, d1, W1, ia1V2, 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( zwz100099 col1,col2])<size([col1,col2],2)。如果你已经计算了rref,那么你已经有了排名。您可以查看 Matlab 文档了解详细信息。您将需要分析您的代码以选择更有效的方法。我将避免猜测 Matlab 在rank()中的作用。虽然做rank()是否意味着做rref中的工作可以提出一个很好的_separate_问题。

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

还有另一种使用线性代数基本定理的方法(*对这个不幸的命名感到叹息):

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

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


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


编辑1:

让我们通过一个例子来更清楚地了解ia是如何工作的。假设我们为A2B命名后缀为1。我们需要

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),也应该这样做。

当然,手头有多种方法,比较不同方法的结果是个好主意。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐