在下面的程序中,我想逐步更新A
,并希望评估当前A
与之前A
之间的差异,该差异存储为A_old
,对于每个i
循环。但是,该程序会从第二次更新返回0.0
dif
,即从i=2
返回。我希望每次都返回1.0
。我调查了原因,发现在A_old
循环中也替换了ii
。谁能告诉我为什么会这样以及如何解决它?
using Devectorize
A=[0.0 0.0];
A_old=[0.0 0.0];
for i=1:10
for ii=1:2
A[ii]=A[ii]+1;
end
dif=maximum(abs(A-A_old))
@devec A_old=A;
println(dif)
end
答案 0 :(得分:4)
注意Devectorize
基本上已被广播更改弃用。一种解决方案是使用copy!
:
A=[0.0 0.0];
A_old=[0.0 0.0];
for i=1:10
for ii=1:2
A[ii]=A[ii]+1;
end
dif=maximum(abs(A-A_old))
copy!(A_old,A)
println(dif)
end
或者如果您使用v0.5(我强烈推荐),广播语法可以轻松进行就地更新:
A=[0.0 0.0];
A_old=[0.0 0.0];
for i=1:10
for ii=1:2
A[ii]=A[ii]+1;
end
dif=maximum(abs(A-A_old))
A_old.=A
println(dif)
end
答案 1 :(得分:4)
当遇到宏问题时,我强烈建议使用macroexpand
来确保它正在执行您认为正在执行的操作。在这种情况下,@devec
对A_old=A
无效:
julia> macroexpand(:(@devec A_old=A))
quote
A_old = A
end
请参阅克里斯的回答,了解其他编写方法以复制数据。
答案 2 :(得分:2)
避免复制的标准“技巧”是用
交换两个数组Aold, A = A, Aold
这实际上是在交换这些绑定(变量名称)所指的哪些内存块。