2017-11-17 33 views
0

줄리아는 복잡한 요소가있는 행렬을 올바르게 처리한다고 생각합니다.복잡한 hermitian 행렬의 내부 조작/symmetric.jl에서 "RealHermSymComplexHerm"의 사용법을 설명합니다

내 작업은 Hermitian 행렬 H의 스펙트럼을 수정하고 스펙트럼이 수정 된 행렬 만 반환하는 것입니다. 즉 나는 f(real_vec)->real_vec의 기능을 가지고있어 의 s(H)의 스펙트럼을 수정합니다. 결과는 f(H) = U[f(s(H))]U'이 필요합니다. eigfact(H)을 명시 적으로 계산하지 않아도 최적화 할 수 있다고 생각합니다.

따라서 나는 이라는 줄리아 실현을 기반으로 자신의 eigmodif을 작성하려고했습니다. 내가 lapack.jl에서 4816 줄에서 길을 잃었 기 때문에 어려웠다. syevr()이 싸여있다.

필자는 어디서 어떻게 이해해야할까요? 줄리아가 복잡한 허미 모형 매트릭스를 진짜 - 시메트릭 매트릭스로 변환했습니다. 이론적으로 그것은 가능하다. 왜냐하면 우리는 2n x 2n 행렬 J를 가지기 때문에 마이너스 정체성을 제곱한다. n 개의 복잡한 에르 미트 행렬에 의한 N을 위해 우리는 다음 real(H).I + imag(H).J로 돌려, 또는 블록 형태

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

하지만 어떻게 줄리아가 이렇게 않습니다에?

답변

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 함수는 Hermitian 행렬 전용이며 복잡한 입력을 허용합니다. 그래서 계산과 복잡한 숫자 처리의 고기는 LAPACK 내부에서 계속됩니다.

+0

위대한, 잘 했어, 정말 고마워! –