Julia - 为稀疏矩阵预分配

时间:2017-09-22 00:39:07

标签: memory memory-management julia

我正在阅读Performance Tips中的预分配,它有这个例子:

function xinc!(ret::AbstractVector{T}, x::T) where T
    ret[1] = x
    ret[2] = x+1
    ret[3] = x+2
    nothing
end

function loopinc_prealloc()
    ret = Array{Int}(3)
    y = 0
    for i = 1:10^7
        xinc!(ret, i)
        y += ret[2]
    end
    y
end

我看到该示例正在尝试更改预先分配的ret。但是,当我尝试以下内容时:

function addSparse!(sp1, sp2)
    sp1 = 2*sp2
    nothing
end

function loopinc_prealloc()
    sp1 = spzeros(3, 3)
    y = 0
    for i = 1:10^7
        sp2 = sparse([1, 2], [1, 2], [2 * i, 2 * i], 3, 3)
        addSparse!(sp1, sp2)
        y += sp1[1,1]
    end
    y
end

我不认为sp1addSparse!更新。在Julia的示例中,函数xinc!逐个修改ret。我怎样才能对稀疏矩阵做同样的事情?

在我的实际代码中,为了节省内存,我需要在循环中更新一个大的稀疏矩阵,这对我来说是预先分配的。

1 个答案:

答案 0 :(得分:2)

问题不在于Matrix是稀疏的。问题在于,当您使用赋值运算符=时,您将名称sp1分配给新对象(值为2sp2),而不是更新sp1矩阵。请考虑性能提示中的示例:ret[1] = x不会重新分配ret它只是修改它的元素。 请改用.=运算符来覆盖容器的所有元素。