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

时间:2017-11-17 16:16:43

标签: julia lapack

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

我的任务是修改Hermitian矩阵H的光谱并仅返回具有修改光谱的矩阵。即我有一个函数f(real_vec)->real_vec,它修改了一个隐士s(H)的谱matrix H=U[s(H)]U'。我需要结果f(H) = U[f(s(H))]U'。我认为可以通过不明确计算eigfact(H)来优化。

因此,我试图根据eigmodif的Julia实现编写自己的eigfact。这很困难,因为我在lapack.jl的第4816行丢失,其中syevr()被包裹起来。

我需要了解Julia将COMPLEX HERMITIAN矩阵转换为REAL-SYMMETRIC矩阵的位置和方式。从理论上讲,它是可能的,因为我们有一个2n乘2n的矩阵J,它与正数相对;对于任何n by n COMPLEX HERMITIAN矩阵H,我们将其转换为real(H).I + imag(H).J或块形式

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

但朱莉娅是怎么做到的?

1 个答案:

答案 0 :(得分: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! 。这些是专用于Hermitian矩阵的LAPACK函数,可接受复杂的输入。因此计算和复杂数字处理的内容在LAPACK内部进行。