我有两个矩阵,其中一个矩阵的特征谱部分非常类似于另一个矩阵的特征谱,但我(目前)唯一能够证实这一点的方法是非常不雅观的。
我对任何解决方案都是开放的,但在这里我发现使用MATLAB语法是最容易的:在第一个例子中,我将定义矩阵A
和B
,这样B
的两个特征值也可以在A
中找到,而B
的对应的两个特征向量也是具有相同特征值的A
的特征向量,但如果不使用与A
共享特征值的B
的特征向量,并“搜索”这些特征向量是否在A
中具有相同的特征值,这一点就不明显了。
下面是两个这样的矩阵的示例:A
和B
A = diag([1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1]);
B = diag([19.9385 7.6177 17.2969 9.6177 11.3208 -1 8.6792 1 11.3208 -1 8.6792 1 19.9385 7.6177 17.2969 9.6177]);
B(2,1) = 9.2832; B(4,3)=B(2,1); B(14,13)=-B(2,1); B(16,15)=-B(2,1);
B = tril(B,-1)'+B; % Make it Hermitian by mirroring the lower triangle into the upper triangle
通过运行命令[eig(A)' ; eig(B)']
,我们可以看到A
的两个特征值(都是-1
)与B
的特征值共享(上行是A
,下行是B
):
-1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1
-1 -1 1 1 8 8 9 9 10 10 11 11 17 17 20 20
A
的特征向量-1
也将B
的特征向量与-1
的特征值相匹配,但当它们出现在A
的特征向量矩阵VA
的第1和第2列时,它们出现在B
的特征向量矩阵VB
的第4和第6列中。
是否有一种更优雅的方法来查看这一点,而不需要蛮力搜索来查看公共特征值的特征向量是否是共享的?
这里有一个稍微复杂一些的例子,其中矩阵大小不一样,特征向量不再是完全相同的,但它们仍然是等价的(具有相同特征值的特征向量):
我已经搜索了相当多的解决方案,并且可以说我知道一些相关的工具,例如:
k
的特征值相对应的特征向量的有用命令:V(:,diag(D)==k)
)。发布于 2021-11-13 22:43:51
我将首先比较所有的特征值和所有的特征向量,然后看看特征值和特征向量是否同时匹配。
我不知道这种方法是否更优雅。这可能是更野蛮的力量。但是,您可以摆脱繁琐的搜索和匹配特征值-特征向量过程,这段代码应该更短。
特征向量是通过取内积来比较的,因为它们比外部积更容易实现。由于matlab对特征向量进行了自动归一化,利用柯西-施瓦兹不等式,线性相关特征向量的内积应该是-1
或1
。
% compare eigenvalues
is_val_same = abs(diag(EA)-diag(EB).') < 1e-8;
% total number of eigenvectors
m=size(VA,2);
n=size(VB,2);
% calculate dot products
dotAB = sum(permute(repmat(conj(VB), 1, 1, m), [1 3 2]).*repmat(VA, 1, 1, n), 1);
dotAB = reshape(dotAB, m, n);
% compare eigenvectors
is_vec_same = abs(abs(dotAB)-1) < 1e-8;
% find the matching eigen pairs
[index_A, index_B]=find(is_vec_same & is_val_same)
输出:
index_A =
4
6
16
12
index_B =
1
2
3
4
这意味着4 6 16 12
of A
分别对应于B
的1 2 3 4
列。
当矩阵大小不相同时,它也能工作。可以通过寻找A
和B
的重复特征向量来识别Dengeneracy,使用与上面类似的代码。
https://stackoverflow.com/questions/65986534
复制相似问题