EJML получает реальное значение собственных векторов матрицы

Я пытаюсь сделать преобразование из не положительно определенной матрицы в положительно определенную, чтобы иметь возможность сделать разложение холецкого. Работая с EJML, которую я считаю хорошей библиотекой, я столкнулся с проблемой при попытке получить собственные векторы матрицы.

EJML возвращает нулевое значение для каждого собственного вектора, где существует мнимое значение. Он не предлагает никаких функций (по крайней мере, не очевидных) для извлечения реального значения, в отличие от других библиотек java, таких как JBlas.

Согласно EJML javadoc (здесь):

MatrixType getEigenVector(int index)

Используется для получения действительных собственных векторов. Если собственный вектор связан с комплексным собственным значением, вместо него возвращается null.

Параметры:

index - индекс пары собственных векторов собственных значений.

Возвращает:

Если связанное собственное значение действительно, то возвращается собственный вектор, в противном случае - нуль.

Чтобы воспроизвести мою проблему, рассмотрим следующий алгоритм:

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 возвращает значение NULL. Мне нужен метод или техника, которые позволят мне отбрасывать мнимые значения и извлекать действительные, не теряя при этом весь вектор.


person Mikel Urkia    schedule 23.09.2014    source источник


Ответы (1)


EJML не поддерживает сложные собственные векторы. Для вычисления сложных собственных векторов должна быть обеспечена поддержка сложных матриц и сложной декомпозиции собственных значений, чего нет в EJML. Вы можете сделать запрос функции на его веб-сайте.

person lessthanoptimal    schedule 25.09.2014
comment
Большое спасибо за ответ, это может быть так же просто, как самому проверить наличие сложных матриц. Я надеюсь, что ваш ответ поможет другим когда-нибудь в будущем. - person Mikel Urkia; 25.09.2014
comment
Хотя она по-прежнему не поддерживается, автор библиотеки заявляет, что она может добавить поддержку сложных матриц раньше, чем позже. Источник: goo.gl/3uf1RW - person Mikel Urkia; 09.10.2014