Внутренние манипуляции со сложной эрмитовой матрицей / объяснение использования RealHermSymComplexHerm в symmetric.jl

Я думаю, что Джулия правильно обрабатывает матрицы со сложными элементами.

Моя задача - изменить спектр эрмитовой матрицы H и вернуть только матрицу с измененным спектром. т. е. у меня есть функция f(real_vec)->real_vec, которая изменяет спектр s(H) эрмитова matrix H=U[s(H)]U'. Мне нужен результат f(H) = U[f(s(H))]U'. Я думаю, что можно оптимизировать, не вычисляя явно eigfact(H).

Поэтому я попытался написать свой собственный eigmodif на основе реализации eigfact Джулией. Это было сложно, потому что я потерялся на строке 4816 в lapack.jl, где syevr() завернуто.

Мне нужно понять, где и как, Юля преобразовала СЛОЖНУЮ ЭРМИТОВУЮ матрицу в ВЕЩЕСТВЕННО-СИММЕТРИЧНУЮ. Теоретически это возможно, поскольку у нас есть матрица J размером 2n на 2n, квадрат которой равен минус единице; для любой n на n КОМПЛЕКСНОЙ ЭРМИТОВОЙ матрице H мы затем превращаем ее в real(H).I + imag(H).J или в блочную форму

[ real(H) -imag(H) ]
[ imag(H) real(H) ]

Но как Юля это делает?


person Yunlong Lian    schedule 17.11.2017    source источник


Ответы (1)


Не эксперт по LAPACK, но, возможно, использование макросов в определении собственных решателей неясно. От linalg/lapack.jl (около строки 4900):

# Hermitian eigensolvers
for (syev, syevr, sygvd, elty, relty) in
    ((:zheev_,:zheevr_,:zhegvd_,:Complex128,:Float64),
     (:cheev_,:cheevr_,:chegvd_,:Complex64,:Float32))
    @eval begin
        # SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, INFO )
        # *     .. Scalar Arguments ..
        #       CHARACTER          JOBZ, UPLO
⋮  
⋮

Таким образом, код макроса использует $syevr в качестве заполнителя для ссылки на :zheevr_ и :cheevr_ в двух проходах цикла, определяя один и тот же syevr! для сигнатур разных типов. Это функции LAPACK, предназначенные для эрмитовых матриц и принимающие сложные входные данные. Таким образом, основная часть вычислений и обработки сложных чисел выполняется внутри LAPACK.

person Dan Getz    schedule 18.11.2017