当我试图在Matlab中找到具有重复特征值但没有缺陷的矩阵的特征分解时,它不会返回特征向量的标准正交矩阵。例如:
k = 5;
repeats = 1;
% First generate a random matrix of eignevectors that is orthonormal
V = orth(rand(k));
% Now generate a vector of eigenvalues with the given number of repeats
D = rand(k,1);
for i = 1:repeats
% Put one random value into another (note this sometimes will result in
% less than the given number of repeats if we ever input the same
% number)
D(ceil(k*rand())) = D(ceil(k*rand()));
end
A = V'*diag(D)*V;
% Now test the eignevector matrix of A
[V_A, D_A] = eig(A);
disp(V_A*V_A' - eye(k))
我发现我的特征向量矩阵V_A
不是正交的,即V_A*V_A'
不等于单位矩阵(考虑舍入误差)。
我的印象是,如果我的矩阵是实数和对称的,那么Matlab将返回一个正交矩阵的特征向量,那么这里的问题是什么?
这似乎是一个数值精度问题。
实对称矩阵的特征向量是正交的。但是你的输入矩阵A
不是完全对称的。差异在eps
的数量级上,正如数值误差所期望的那样。
>> A-A.'
ans =
1.0e-16 *
0 -0.2082 -0.2776 0 0.1388
0.2082 0 0 -0.1388 0
0.2776 0 0 -0.2776 0
0 0.1388 0.2776 0 -0.5551
-0.1388 0 0 0.5551 0
如果你强制A
完全对称,你会得到一个正交的V_A
,直到eps
的数值误差:
>> A = (A+A.')/2;
>> A-A.'
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
>> [V_A, D_A] = eig(A);
>> disp(V_A*V_A' - eye(k))
1.0e-15 *
-0.3331 0.2220 0.0755 0.1804 0
0.2220 -0.2220 0.0572 -0.1665 0.1110
0.0755 0.0572 -0.8882 -0.0590 -0.0763
0.1804 -0.1665 -0.0590 0 -0.0555
0 0.1110 -0.0763 -0.0555 0
尽管如此,令人惊讶的是,当A
是对称的,A
是接近对称时,V_A
得到了如此不同的结果。这是我对正在发生的事情的猜测:正如@ArturoMagidin所指出的,
(1)对称矩阵的不同特征值所对应的特征向量必须彼此正交。对应于相同特征值的特征向量不必彼此正交。
(2)然而,由于每个子空间都有一个标准正交基,你可以找到每个特征空间的标准正交基,所以你可以找到特征向量的标准正交基。
只有当A
是对称的时,Matlab才可能采取路由(2)(从而迫使V_a
正交)。对于不完全对称的A
,它可能采取路线(1)并给出每个子空间的基,但不一定是正交向量。
实矩阵的特征向量当且仅当AA'= a ' a且特征值不相等时正交。如果特征值不明显,MATLAB选择一个正交的向量系统。在上面的例子中,AA'~=A'A。此外,您必须考虑舍入和数值误差。