假设我有一个像
这样的现有数组x = rand(4)
然后我想将x
重置为零。我可以避免做x = zeros(4)
。我对内存分配感到不满。
答案 0 :(得分:8)
一行中最好的方法是:
x[:] = zero(y)
或
fill!(x,zero(y))
其中y
是您希望它的数字类型。这种方式很好的原因是它适用于所有情况。如果x
是任何类型,只要y
与类型匹配(使用y=x[1]
),使用此方法就可以正常工作。
当我指任何类型时,我的意思是这也适用于奇数类型,如SIUnits。如果使用此命令,则程序包可以支持SIUnit而无需导入程序包,因为这会将正确的单位应用于x
值(只要其所有操作的单位都正确),而{{{错误单位会导致错误(您也可以使用fill!(x, 0.0)
。否则您必须检查单位和各种事物。
答案 1 :(得分:3)
你可以做到
fill!(x, 0.0)
这会用零覆盖内容。
这应该和仅仅执行for
循环一样有效:
for i in 1:length(x)
x[i] = 0.0
end
的确,如果你做@edit fill!(x, 0.0)
,你会发现这基本上就是它正在做的事情(除了它使用@inbounds
以提高效率)。
答案 2 :(得分:1)
在我看来,人们已经提出了很好的替代方法,但是没有人解决了实际问题"什么是最有效的方式(特别是在记忆方面)"。
所以在这里。给出:
f1(x) = x = zeros(size(x));
f2(x) = x[:] = zero(x[1]);
f3(x) = fill!(x, zero(x[1]));
f4(x) = x = zero(x);
我们有:
julia> x=rand(1000,1000); @time (for i in 1_000_000_000; x=f1(x); end;)
0.000715 seconds (3 allocations: 7.629 MB)
julia> x=rand(1000,1000); @time (for i in 1_000_000_000; f2(x); end;)
0.000691 seconds (2 allocations: 32 bytes)
julia> x=rand(1000,1000); @time (for i in 1_000_000_000; f3(x); end;)
0.000702 seconds (2 allocations: 32 bytes)
julia> x=rand(1000,1000); @time (for i in 1_000_000_000; x=f4(x); end;)
0.000704 seconds (2 allocations: 7.629 MB)
<小时/> PS。作为对以下一些评论的回应,上述方法的比较纯粹是为了证明方法定量而不是通用抽象术语中的差异,以便更全面地解决&#34的问题。什么更有效率,多少&#34;等
f1
或f4
突变功能;它们不是,它们返回对内存中新对象的引用;即他们是为了完整性来证明OP可能试图避免的坏替代品。
我只是觉得这个问题是关于&#34;效率&#34;值得一些数字来补充我的同事提出的建议:)