1

コレスキー分解を行うために、非正定行列から正定行列への変換を試みています。良いライブラリだと思う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 です。プロセスですべてのベクトルを失うことなく、虚数の値をマージして実数の値を抽出できる方法または手法が必要です。

4

1 に答える 1

1

EJML は複雑な固有ベクトルをサポートしていません。複雑な行列の複雑な固有ベクトルのサポートを計算するには、複雑な固有値分解を提供する必要がありますが、これは EJML では提供されません。Web サイトで機能のリクエストを行うことができます。

于 2014-09-25T12:25:37.557 に答える