为什么在朱莉娅中更换另一个阵列?

时间:2016-12-01 16:22:51

标签: arrays julia

在下面的程序中,我想逐步更新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

3 个答案:

答案 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来确保它正在执行您认为正在执行的操作。在这种情况下,@devecA_old=A无效:

julia> macroexpand(:(@devec A_old=A))
quote
    A_old = A
end

请参阅克里斯的回答,了解其他编写方法以复制数据。

答案 2 :(得分:2)

避免复制的标准“技巧”是用

交换两个数组
Aold, A = A, Aold

这实际上是在交换这些绑定(变量名称)所指的哪些内存块。