1

我正在尝试将非正定矩阵转换为正定矩阵,以便能够进行cholesky分解。使用我认为是一个很好的库的EJML,我在尝试获取矩阵的特征向量时遇到了麻烦。

EJML为每个存在虚值的特征向量返回一个空值。与JBlas等其他java库不同,它不提供任何功能(至少不是显而易见的功能)来提取真正的价值。

根据EJML javadoc这里):

MatrixType getEigenVector(整数索引)

用于检索实值特征向量。如果特征向量与复特征值相关联,则返回 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  

据我了解,特征向量矩阵的前两列是空的,因为存在使EJML返回空值的虚值。我需要一种方法或技术,可以让我保留虚值并提取真实值,而不会丢失过程中的所有向量。

4

1 回答 1

1

EJML 不支持复杂的特征向量。要计算复杂特征向量,必须提供对复杂矩阵的支持,并且必须提供复杂的特征值分解,而 EJML 没有提供。您可以在其网站上提出功能请求。

于 2014-09-25T12:25:37.557 回答