Вычисление комплексных собственных векторов разреженной матрицы в Java

Я пытаюсь вычислить собственные значения и собственные векторы потенциально больших и разреженных несимметричных NxN матрица (N > 10 ^ 6). Мне не нужны все из них, но, возможно, первый из них. В идеале я хотел бы сделать это из Java, но при необходимости мог бы перейти на C, C++ или Python.

Моя матрица потенциально может иметь как сложные собственные значения, так и собственные векторы. Например, посмотрите результаты для этого образца Wolfram Alpha.

Я нашел несколько способов сделать это, используя несколько библиотек Java, и написал для них некоторый оценочный код:

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

Мне действительно нужны собственные значения в сложной форме, если таковые имеются.

Теперь я недавно начал изучать Spectra (C++), которая, кажется, поддерживает мой вариант использования. Но я хотел бы сначала спросить и, возможно, отбросить недоразумение со своей стороны или что-то, что я, возможно, пропустил из земли Java, потому что я хотел бы продолжать использовать одну платформу / язык, насколько это возможно.

Есть что-нибудь, что я должен изучить? Кроме того, если я в конечном итоге отойду от Java для этой задачи, какие-нибудь другие альтернативы Spectra я мог бы изучить? Спасибо!

1 ответ

Решение

На всякий случай, если кто-нибудь наткнется на это, я наконец пошел по пути C++, потому что ни одна из библиотек Java не предоставляла сложные собственные векторы, как мне было нужно.

В итоге я реализовал большинство вещей, которые мне нужны, в C++, используя Spectra и Eigen. Затем я построил серию собственных классов-оболочек, используя SWIG.

Для всех в будущем с таким же вопросом: есть библиотека для Java под названием Jeigen, которая может сделать это. На самом деле это Java-оболочка для библиотеки Eigen C++, которую автор уже упоминал в своем ответе.

Вы можете найти Jeigen здесь.

Другие вопросы по тегам