如何在 Julia 中调用 LAPACK 代码(cpbtrf)
How to call LAPACK code (cpbtrf) in Julia
我目前正在尝试将我现有的 Python 代码翻译成 Julia,我需要计算带状复杂矩阵的 Cholesky 分解。正确的 LAPACK 例程是 cpbtrf(SciPy 当前调用的那个),我正在努力让它在 Julia 中工作。
我不确定要提供哪些额外的细节,我对 Julia 还很陌生,我确定我在做一些愚蠢的事情。 LAPACK 在 info 变量中调用 returns 1,表示某些东西不是正定的,但我知道它是(SciPy 愉快地分解相同的矩阵)。
BlasInt = Base.LinAlg.BlasInt
chk = Base.LinAlg.chkstride1
function cholesky_banded!(ab::StridedMatrix{Complex128}, uplo::Char, n::Integer, kd::Integer)
chk(ab)
ldab = size(ab,1)
info = Ref{BlasInt}()
ccall((:cpbtrf_,Base.liblapack_name),Void,(Ptr{UInt8},Ptr{BlasInt},Ptr{BlasInt},
Ptr{Complex128},Ptr{BlasInt},Ptr{BlasInt}),&uplo,&n,&kd,ab,&ldab,info)
ab, info[]
end
mat = zeros(Complex128,2,3)
mat[1,1:end] = 2
mat[2,1:end-1] = -1
cholesky_banded!(mat,'L',3,1)
编辑:澄清一下,这是一个骨架示例。我正在编写的代码处理 10^5 或更大阶的矩阵,并且可能需要五角、六角、七角矩阵等。我需要一个带状特定的算法。
除了LAPACK子程序外,其他都是正确的。您正在使用 128 位复数,因此您应该使用 :zpbtrf_
而不是 :cpbtrf_
。
我目前正在尝试将我现有的 Python 代码翻译成 Julia,我需要计算带状复杂矩阵的 Cholesky 分解。正确的 LAPACK 例程是 cpbtrf(SciPy 当前调用的那个),我正在努力让它在 Julia 中工作。
我不确定要提供哪些额外的细节,我对 Julia 还很陌生,我确定我在做一些愚蠢的事情。 LAPACK 在 info 变量中调用 returns 1,表示某些东西不是正定的,但我知道它是(SciPy 愉快地分解相同的矩阵)。
BlasInt = Base.LinAlg.BlasInt
chk = Base.LinAlg.chkstride1
function cholesky_banded!(ab::StridedMatrix{Complex128}, uplo::Char, n::Integer, kd::Integer)
chk(ab)
ldab = size(ab,1)
info = Ref{BlasInt}()
ccall((:cpbtrf_,Base.liblapack_name),Void,(Ptr{UInt8},Ptr{BlasInt},Ptr{BlasInt},
Ptr{Complex128},Ptr{BlasInt},Ptr{BlasInt}),&uplo,&n,&kd,ab,&ldab,info)
ab, info[]
end
mat = zeros(Complex128,2,3)
mat[1,1:end] = 2
mat[2,1:end-1] = -1
cholesky_banded!(mat,'L',3,1)
编辑:澄清一下,这是一个骨架示例。我正在编写的代码处理 10^5 或更大阶的矩阵,并且可能需要五角、六角、七角矩阵等。我需要一个带状特定的算法。
除了LAPACK子程序外,其他都是正确的。您正在使用 128 位复数,因此您应该使用 :zpbtrf_
而不是 :cpbtrf_
。