使用 Julia 的点符号和就地操作

Using Julia's dot notation and in place operation

如何使用 Julia 的点表示法进行元素运算并确保结果保存在现有数组中?

function myfun(x, y)
    return x + y
end

a = myfun(1, 2)  # Results in a == 3

a = myfun.([1 2], [3; 4])  # Results in a == [4 5; 5 6]

function myfun!(x, y, out)
    out .= x + y
end

a = zeros(2, 2)
myfun!.([1 2], [3; 4], a)  # Results in a DimensionMismatch error

此外,@. a = myfun([1 2], [3; 4]) 将结果写入 a 的方式与我尝试用 myfun!() 实现的方式相同吗?也就是说,该行是否直接将结果写入 a 而没有先将结果存储在其他任何地方?

您的代码应该是:

julia> function myfun!(x, y, out)
           out .= x .+ y
       end
myfun! (generic function with 1 method)

julia> myfun!([1 2], [3; 4], a)
2×2 Matrix{Float64}:
 4.0  5.0
 5.0  6.0

julia> a
2×2 Matrix{Float64}:
 4.0  5.0
 5.0  6.0

至于@. a = myfun([1 2], [3; 4]) - 答案是肯定的,它不创建临时数组并操作in-place。

这通常不是必需的,通常有更好的方法来实现这一点,但是可以通过使用指向输出数组内部的 Reference 值来广播输出参数。

julia> a = zeros(2, 2)
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0

julia> function myfun!(out, x, y)
          out[] = x + y
       end
myfun! (generic function with 1 method)

julia> myfun!.((Ref(a, i) for i in LinearIndices(a)), [1 2], [3; 4])
2×2 Matrix{Int64}:
 4  5
 5  6

julia> a
2×2 Matrix{Float64}:
 4.0  5.0
 5.0  6.0

编辑:根据 Style guideout 更改为第一个参数 - 感谢@phipsgabler 的提醒。