我目前正在尝试将现有的Python代码转换为Julia,并且需要计算带状复杂矩阵的Cholesky分解。正确的LAPACK例程是cpbtrf(当前由SciPy调用的例程),而我正在努力使其在Julia中运行。

我不确定要提供什么额外的细节,对于Julia来说我还很陌生,而且我确定自己做的事情很愚蠢。 LAPACK调用在info变量中返回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_

关于math - 如何在Julia中调用LAPACK代码(cpbtrf),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34594954/

10-11 14:57