如何求两个特征值不同的矩阵的公共特征向量

2024-09-25 10:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望在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时,得到了有效的结果,该自同态由: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中总结,就好像它是一个原型一样,如果它能工作,那么就用MKL或Python函数来完成这个合成。因此,也需要标记python

我如何建立这些公共特征向量并找到相关的特征值?我有点迷失在现有的所有可能实现它的方法之间

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

Eigen vectors common and kernel of commutator

编辑1:从数学交换中,我们建议在换向器[A,B]上使用奇异值分解(SVD),这是在Matlab中通过以下方式实现的:

“如果𝑣 是公共特征向量,则‖(𝐴𝐵−𝐵𝐴)𝑣‖=SVD方法为您提供了一个单位向量𝑣 这将‖最小化(𝐴𝐵−𝐵𝐴)𝑣‖ (限制条件是‖𝑣‖=1) "

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

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

是否有办法提高精确度,以最大限度地减少‖(𝐴𝐵−𝐵𝐴)𝑣‖ 尽可能多?

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

关于本征向量的公共基,我正在寻找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矩阵:

Matrix A

Matrix B


Tags: theto方法矩阵向量matrixspfinal
2条回答

我怀疑这是一个相当微妙的问题

首先,在数学上,A和B是同时对角化的,当它们通勤时,也就是当它们通勤时

A*B - B*A == 0 (often A*B-B*A is written [A,B])
(for if A*X = X*a and B*X = X*b with a, b diagonal then
A = X*a*inv(X), B = X*b*inv(X) 
[A,B] = X*[a,b]*inv(X) = 0 since a and b, being diagonal, commute)

所以我想说,首先要检查的是,你的A和B确实通勤,这是第一个棘手的问题:由于舍入误差,计算出的[A,B]不可能都是零,你需要确定[A,B]非零是因为舍入误差,还是实际上,A和B不通勤

现在假设x是A的特征向量,特征值为e。然后

A*B*x = B*A*x = B*e*x = e*B*x

从数学上讲,我们有两种可能性:要么Bx是0,要么Bx也是A的特征向量,特征值为e

一个很好的例子是A的所有元素都不同,即A的每个特征空间都是一维的。在这种情况下: 如果AX=Xa表示对角线a,那么BX=Xb表示对角线b(需要进行计算)。如果你对角化A,并且所有的特征值都是完全不同的,那么你可以假设每个特征空间的维数都是1,但是“足够”是什么意思呢?唉,又是一个微妙的问题。如果两个计算的特征值非常接近,那么特征值是不同的还是差异舍入误差? 总之,为了计算b的每个特征向量x,来计算b的特征值。如果| | Bx | |与| | x | |相比足够小,那么B的本征值为0,否则为

x'*B*x/(x'*x) 

在一般情况下,一些特征空间的维数可能大于1。一维本征空间可以如上所述处理,但高维本征空间需要更多的计算

假设m个特征向量x[1]。。A的x[m]对应于特征值e。由于A和B通勤,很容易看出B将xs跨越的空间映射到了它自己。设C为mxm矩阵

C[i,j] = x[j]'*B*x[i]

然后C是对称的,所以我们可以对它进行对角化,即用

C = V'*c*V

如果我们定义

y[l] = Sum{ k | V[l,k]*x[k] } l=1..m

然后一点代数表明y[l]是B的特征向量,特征值为c[l]。此外,由于每个x[i]是具有相同特征值e的A的特征向量,因此每个y[l]也是具有特征向量e的A的特征向量

总而言之,我认为一种方法是:

  1. 计算[A,B],如果真的不是0,就放弃
  2. 对A进行对角化,对要增加的特征值进行排序(对特征向量进行排序!)
  3. 识别A的特征空间。对于一维空间,A的对应特征向量是B的特征向量,您需要计算的只是B的特征值。对于高维空间,请按照上一段进行

测试换向器是否为零的一种相对昂贵(在计算工作中)但合理可靠的方法是计算换向器的奇异值,取最大奇异值,比如c,并取A和b的最大奇异值(或特征值的最大绝对值)。除非c小得多(例如1e-10倍)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*^{}对于一些小的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中进行了计算,得到了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将帮助您追溯哪些列依赖于哪些其他列。你可以从这里建立交叉点。像往常一样,要警惕数字错误妨碍了==语句。我们将要讨论一个不同的问题,即如何从Matlab中的rref()得到线性相交,所以我将把它留在这里

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

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

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


现在我想我们完了


编辑1:

让我们用一个例子来说明ia是如何工作的。假设我们用一个尾随的1来命名所有事物,用A2来命名所有事物。我们需要

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

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

相关问题 更多 >