コレスキー分解を行うために、非正定行列から正定行列への変換を試みています。良いライブラリだと思うEJMLを使って作業していると、行列の固有ベクトルを取得しようとするときに問題が発生しました。
EJMLは、虚数が存在する固有ベクトルごとに null 値を返します。JBlasのような他のJavaライブラリとは異なり、実際の値を抽出するための機能 (少なくとも明白なものではない) は提供しません。
EJML javadocによると( here ):
MatrixType getEigenVector (int インデックス)
実数値の固有ベクトルを取得するために使用されます。固有ベクトルが複素固有値に関連付けられている場合は、代わりに null が返されます。
パラメーター:
index - 固有値固有ベクトル ペアのインデックス。
戻り値:
関連付けられた固有値が実数の場合は固有ベクトルが返され、それ以外の場合は null が返されます。
私の問題を再現するには、次のアルゴリズムを検討してください。
DenseMatrix64F origMatrix = RandomMatrices.createRandom(size, size, -2, 2, rand);
Original Matrix (non positive definite):
0.543 -1.405 1.580
1.227 1.686 -0.064
1.080 -1.689 0.645
EigenDecomposition<DenseMatrix64F> eig = DecompositionFactory.eig(size, true);
eig.decompose(origMatrix);
int eigValNum = eig.getNumberOfEigenvalues();
for(int i = 0; i < eigValNum; i++){
DenseMatrix64F eigMat = eig.getEigenVector(i);
if(eigMat != null){
//Store all vectors inside a matrix
}
}
Eigenvector Matrix:
0.000 0.000 0.573
0.000 0.000 -0.299
0.000 0.000 -0.763
私が理解していることでは、固有ベクトル行列の最初の 2 つの列は、 EJMLが NULL 値を返すようにする既存の虚数のために null です。プロセスですべてのベクトルを失うことなく、虚数の値をマージして実数の値を抽出できる方法または手法が必要です。