使用 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。
这通常不是必需的,通常有更好的方法来实现这一点,但是可以通过使用指向输出数组内部的 Ref
erence 值来广播输出参数。
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 guide 将 out
更改为第一个参数 - 感谢@phipsgabler 的提醒。
如何使用 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。
这通常不是必需的,通常有更好的方法来实现这一点,但是可以通过使用指向输出数组内部的 Ref
erence 值来广播输出参数。
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 guide 将 out
更改为第一个参数 - 感谢@phipsgabler 的提醒。