我正在阅读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
我不认为sp1
由addSparse!
更新。在Julia的示例中,函数xinc!
逐个修改ret
。我怎样才能对稀疏矩阵做同样的事情?
在我的实际代码中,为了节省内存,我需要在循环中更新一个大的稀疏矩阵,这对我来说是预先分配的。
答案 0 :(得分:2)
问题不在于Matrix是稀疏的。问题在于,当您使用赋值运算符=
时,您将名称sp1
分配给新对象(值为2sp2
),而不是更新sp1
矩阵。请考虑性能提示中的示例:ret[1] = x
不会重新分配ret
它只是修改它的元素。
请改用.=
运算符来覆盖容器的所有元素。