固有値が複素数となる場合,IMLの固有値関数eigval(),固有ベクトル関数eigvec()の値の読み方が特殊なので,簡単に説明します.
nxn行列において,n個の複素固有値は,nx2行列で返されます.1列目が実部で2列目が虚部です.
固有値は,実部,虚部で降順に行ソートされているので,複素共役となる固有値は,かならず隣同士の行に配置されています.
n個の固有ベクトルは,nxn行列で返されます.
i行目の固有値が実数の場合は,対応する固有ベクトルは,i列ベクトルになります.
ここが少しわかりにくいのですが,
i行目とi+1行目が共役な複素固有値ならば,対応する2つの共役な複素固有ベクトルの実部は,i列ベクトルで,
虚部は,i+1ベクトルです.
以下に例を示します.
proc iml;
a={
0 0 1
,1 0 0
,0 1 0
};
v=eigval(a);
w=eigvec(a);
print a, v,w;
run;
/*
A
0 0 1
1 0 0
0 1 0
V
実部 虚部
1 0 <- フロベニウス根
-0.5 0.8660254 <- -0.5+0.866i
-0.5 -0.866025 <- -0.5-0.866i
W
1番目の 2番目と3番目の共役な複素
実固有値 固有値に対応する
の 複素固有値の
固有 実部 虚部
ベクトル
-0.57735 0.2886751 0.5
-0.57735 0.2886751 -0.5
-0.57735 -0.57735 0
整理すると
3つの固有値
1 , -0.5+0.866i , -0.5-0.866i
対応する
固有ベクトル ↓ ↓
↓
-0.577 0.289+0.5i 0.289-0.5i
-0.577 0.289-0.5i 0.289+0.5i
-0.577 -0.577 -0.577
*/