2014-09-23 2 views
1

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

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

Согласно EJMLJavaDoc (here):

MatrixType getEigenVector (интермедиат индекс)

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

ответ

1

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

+0

Большое спасибо за ответ, это может быть так же легко, как проверить наличие сложных матриц. Я надеюсь, что ваш ответ поможет другим в будущем. –

+0

Несмотря на то, что автор по-прежнему не поддерживается, автор библиотеки заявляет, что он может добавить сложную матричную поддержку раньше, чем позже. Источник: http://goo.gl/3uf1RW –