如何在 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_