Диагонализация эрмитовых матриц Джулия против Фортрана

#fortran90 #numerical-methods #lapack #julia

#фортран90 #численные методы #lapack #джулия

Вопрос:

У меня есть программа, написанная на Fortran и в Julia, в одном из случаев у меня есть симметричные матрицы, и я получаю результаты, более или менее похожие с обеими программами. Когда я переключаюсь на случай, когда у меня есть эрмитовы матрицы, программа на Julia и программа на Fortran дают мне разные данные. Я бы предположил, что, возможно, разница связана с процедурой диагонализации, которую я использую в Fortran:

 ZHEEVD(..)
  

в то время как в Julia я просто использую:

 eig(matrix)
  

Первое, что я замечаю, это то, что ZHEEVD исправляет первую строку матриц собственных векторов на действительные числа (без мнимой части), в то время как eig исправляет последнюю строку на действительные числа.

Есть идеи, как преодолеть эти крошечные различия? Есть еще информация, которая может быть полезна при работе со встроенными функциями линейной алгебры julia?

Ответ №1:

Копаясь в методах Julia ( @less макрос очень удобен для этого), вы обнаружите, что в конечном итоге он вызывает LAPACK.syevr! метод, который в Complex128 случае является оболочкой для ZHEEVR метода LAPACK (прокрутите немного вниз, чтобы увидеть фактическое определение).

Если вы предпочитаете продолжать использовать ZHEEVD , вы можете получить доступ к нему через ccall интерфейс: смотрите раздел руководства по вызову кода C и Fortran. Приведенные выше обертки LAPACK должны содержать множество примеров (LAPACK поставляется как часть OpenBLAS, которая включена в Julia, поэтому вам не нужно устанавливать что-либо еще).