复杂厄密矩阵的内部操作/解释 "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 内部进行。
我认为 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 内部进行。