我认为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) ]
但朱莉娅是怎么做到的?
答案 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内部进行。