Julia 支持矩阵的就地分解(对于某些分解)。
我想知道是否还可以消除函数内部的任何内存分配。
例如,有没有办法在没有隐藏内存分配的情况下对矩阵应用 Cholesky 分解?
最佳答案
非分配 LAPACK 函数在 Julia 中有绑定(bind)。它们记录在 Julia Documentation - Linear Algebra - LAPACK Functions 中.
Cholesky 分解 cholesky!(A)
会覆盖 A
并分配固定的少量内存,而 cholesky(A)
会分配更大的数额。在这里,分配(字节)确实随着 A
的大小呈二次方增长。
let n = 1000; M = rand(n,n); B = transpose(M)*M
cholesky(B)
@time cholesky(B)
# 0.023478 seconds (5 allocations: 7.630 MiB)
end
对比
let n = 1000; M = rand(n,n); B = transpose(M)*M
cholesky!(copy(B))
@time cholesky!(B)
# 0.021360 seconds (3 allocations: 80 bytes)
end
Oscar Smith 指出,性能差异很小。
关于performance - 在 Julia 中分解一个没有任何内存分配的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72309988/