问题描述
我正在寻找或更确切地说在2个矩阵A
和B
之间建立公共特征向量矩阵X,例如:
AX=aX with "a" the diagonal matrix corresponding to the eigenvalues
BX=bX with "b" the diagonal matrix corresponding to the eigenvalues
其中A
和B
是方阵和可对角化矩阵。
我在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)
是否有方法可以提高精度以尽可能地将‖(𝐴𝐵−𝐵𝐴)𝑣‖降至最低?
重要提示:可能你们中的一些人没有完全理解我的目标。
关于特征向量的公共基,我正在寻找V1
和V2
的组合(向量或矩阵),或者直接在两个输入Fisher大理数上使用null
运算符来构建这个新的基&p&q;其中,与已知的D1
和D2
(标记为D1a
和D2a
)之外的其他特征值,我们可以得到:F = P (D1a+D2a) P^-1
要计算新的Fisher矩阵F,我需要知道P
,假设D1a
和D2a
分别等于D1
和D2
对角矩阵(来自A
和B
矩阵的对角化)
如果我知道特征向量P
的公基,我可以从D1
和D2
推导出D1a
和Da2
,不是吗?
以下链接提供了两个Fisher矩阵:
推荐答案
我认为MatLab中没有用于计算两个矩阵的公共特征值的内置工具。我将只概述蛮力方法,并在MatLab中进行,以便突出它的一些与特征向量相关的方法。我们将假设矩阵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
就足够了。
例如
>> 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中进行了计算,得出A
的V1, D1, d1, W1, ia1
和B
的V2, 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)
,但最后一个空格有警告,col2
和check_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
的后缀1
和B
的后缀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)
,也应该执行相同的操作。
当然,由于手头有多种方法,最好跨方法比较结果。
这篇关于如何求两个特征值不同的矩阵的公共特征向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!