我在我的代码中观察到“.+=”的意外行为(可能只是我,我对 Julia 很陌生)。考虑以下示例:
julia> b = fill(zeros(2,2),1,3)
1×3 Array{Array{Float64,2},2}:
[0.0 0.0; 0.0 0.0] [0.0 0.0; 0.0 0.0] [0.0 0.0; 0.0 0.0]
julia> b[1] += ones(2,2)
2×2 Array{Float64,2}:
1.0 1.0
1.0 1.0
julia> b
1×3 Array{Array{Float64,2},2}:
[1.0 1.0; 1.0 1.0] [0.0 0.0; 0.0 0.0] [0.0 0.0; 0.0 0.0]
julia> b[2] .+= ones(2,2)
2×2 Array{Float64,2}:
1.0 1.0
1.0 1.0
julia> b
1×3 Array{Array{Float64,2},2}:
[1.0 1.0; 1.0 1.0] [1.0 1.0; 1.0 1.0] [1.0 1.0; 1.0 1.0]
可以看出,最后一条命令不仅改变了 b[2] 的值,还改变了 b[3] 的值,而 b[1] 保持与之前(*)相同,我们可以确认运行:
julia> b[2] .+= ones(2,2)
2×2 Array{Float64,2}:
2.0 2.0
2.0 2.0
julia> b
1×3 Array{Array{Float64,2},2}:
[1.0 1.0; 1.0 1.0] [2.0 2.0; 2.0 2.0] [2.0 2.0; 2.0 2.0]
现在,简单地使用“+=”代替我可以获得我对“.+=”的预期行为,即:
julia> b = fill(zeros(2,2),1,3); b[2]+=ones(2,2); b
1×3 Array{Array{Float64,2},2}:
[0.0 0.0; 0.0 0.0] [1.0 1.0; 1.0 1.0] [0.0 0.0; 0.0 0.0]
谁能解释我为什么会这样?我当然可以只使用 +=,或者可能与数组数组不同的东西,但是因为我正在努力提高速度(我有一个代码需要执行这些操作数百万次,并且需要在更大的矩阵上执行)和 . += 速度要快得多,如果我仍然可以利用此功能,我想了解一下。谢谢大家!
编辑: (*) 显然只是因为 b[1] 不为零。如果我运行:
julia> b = fill(zeros(2,2),1,3); b[2]+=ones(2,2);
julia> b[1] .+= 10 .*ones(2,2); b
[10.0 10.0; 10.0 10.0] [1.0 1.0; 1.0 1.0] [10.0 10.0; 10.0 10.0]
您可以看到只有零值发生了变化。这打败了我。