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
,对应的特征向量是vr
、l1=(-0.57..., -0.57..., -0.57...)
的第一列。这与您给出的第三个特征向量 (1, 1, 1)
.
成正比
第二个和第三个特征值都是2
。对应的特征向量是vr
、l2=(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)
.
成正比
我想计算矩阵的特征值和特征向量。我正在使用 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
,对应的特征向量是vr
、l1=(-0.57..., -0.57..., -0.57...)
的第一列。这与您给出的第三个特征向量 (1, 1, 1)
.
第二个和第三个特征值都是2
。对应的特征向量是vr
、l2=(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)
.