MKL sgeev 的错误特征向量

Wrong eigenvector with MKL sgeev

我想计算矩阵的特征值和特征向量。我正在使用 sgeev 的 MKL lapack。

我有这个非常简单的测试代码:

integer :: i,n, info
real, allocatable:: A(:,:), B(:,:), C(:,:)
real, allocatable:: wr(:), wi(:), vl(:, :), vr(:, :), work(:)
n=3
allocate(vr(n,n), vl(n,n), wr(n), wi(n), work(4*n))
allocate(A(n,n),B(n,n), C(n,n))
A(1,:)=(/-1.0,3.0,-1.0/)
A(2,:)=(/-3.0,5.0,-1.0/)
A(3,:)=(/-3.0,3.0,1.0/)
call sgeev('V','V',n,A,n,wr,wi,vl,n,vr,n,work,size(work,1),info)
print*,info
do i=1,n
  print*,i,wr(i),wi(i)
enddo
print*,'vr'
do i=1, n
  print*, vr(i,:)
enddo
print*,'vl'
do i=1, n
  print*, vl(i,:)
enddo

它给出了正确的特征值 (2, 2, 1) 但给出了错误的特征向量。

我有:

 vr
 -0.577350259      0.557844639     -0.539340019    
 -0.577350557      0.704232574     -0.273908198    
 -0.577349961      0.439164847      0.796295524    
 vl
 -0.688247085     -0.617912114     -0.815013587    
  0.688247383      0.771166325      0.364909053    
 -0.229415640     -0.153254643      0.450104564 

VR 应该在什么时候

-1   1   1
 0   1   1
 3   0   1

我做错了什么?

你的矩阵是degenerate(有两个相同的特征值),所以对应的特征向量可以是两个退化特征向量的任意线性组合。

此外,sgeev normalises the eigenvectors 的输出,而您给出的特征向量未归一化。

给出的第一个特征值是1,对应的特征向量是vrl1=(-0.57..., -0.57..., -0.57...)的第一列。这与您给出的第三个特征向量 (1, 1, 1).

成正比

第二个和第三个特征值都是2。对应的特征向量是vrl2=(0.55..., 0.70..., 0.43...)l3=(-0.53..., -0.27..., 0.79...)的第二列和第三列。取 0.27...*l2+0.70...*l3 得到 (-0.22..., 0, 0.66...),与 (-1, 0, 3) 成正比,取 0.79...*l2-0.43...*l3 得到 (0.66..., 0.66..., 0),与 (1, 1, 0).

成正比