复杂厄密矩阵的内部操作/解释 "RealHermSymComplexHerm" 在 symmetric.jl 中的使用

Internal manipulation of complex hermitian matrix / explain the use of "RealHermSymComplexHerm" in symmetric.jl

我认为 Julia 可以正确处理具有复杂元素的矩阵。

我的任务是修改 Hermitian 矩阵 H 的频谱,return 只是修改了频谱的矩阵。即我有一个函数 f(real_vec)->real_vec 可以修改厄尔米特 matrix H=U[s(H)]U' 的光谱 s(H)。我需要结果 f(H) = U[f(s(H))]U'。我认为可以通过不显式计算 eigfact(H).

来优化

因此我尝试基于 eigfact 的 Julia 实现编写自己的 eigmodif。这很困难,因为我在 lapack.jl 的 4816 行迷路了,syevr() 结束了。

我需要了解 Julia 在哪里以及如何将复杂的厄米矩阵转换为实对称矩阵。理论上这是可能的,因为我们有一个 2n 乘 2n 的矩阵 J,它的平方等于负恒等式;对于任何 n x n 复数厄米矩阵 H,我们然后将其转换为 real(H).I + imag(H).J,或块形式

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

但是 Julia 是怎么做到的呢?

不是 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!类型签名。这些是专用于 Hermitian 矩阵并接受复数输入的 LAPACK 函数。所以计算和复数处理的核心在 LAPACK 内部进行。