我想知道在Julia的数组中是否有1个班轮来完成此任务:
h = .1
L = 1
x = 0:h:L
n = length(x)
discretized = zeros(n,n)
#really any old function
f(x,y) = x*y + cos(x) + sin(y)
for i in 1:n
for j in 1:n
discretized[i, j] = f(x[i], x[j])
end
end
还是我必须明确地写出循环?
答案 0 :(得分:1)
您可以将函数广播到其转置的数组上-julia将返回结果为2d数组:
x = 0:0.1:1
f(x,y) = x*y + cos(x) + sin(y)
A = f.(x,x') # the `.` before the bracket broadcasts the dimensions
# 11×11 Array{Float64,2}
或者如果具有更复杂的表达式或函数并且不想写很多点,请使用@.
宏,例如:
A = @. f(x,x') + x^2
一旦A
已经存在,您也可以
@. A = f(x,x') + x^2
使用.=
将结果本地写入A
的每个元素,因此是非分配的。
广播比将标量函数轻松扩展到数组要容易得多,可以将多个计算“融合”到单个快速操作https://julialang.org/blog/2017/01/moredots
答案 1 :(得分:0)
您可以这样做:
discretized = [f(i, j) for i in x, j in x]
有关更多信息,请参见https://docs.julialang.org/en/v1/manual/arrays/#Comprehensions-1
编辑:根据评论,下面简要介绍:
运算符在索引编制中的作用:
julia> a = [1, 2, 3]
3-element Array{Int64,1}:
1
2
3
julia> a[:]
3-element Array{Int64,1}:
1
2
3
julia> ans === a
false
julia> a[:] .= [2, 3, 4]
3-element view(::Array{Int64,1}, :) with eltype Int64:
2
3
4
julia> a
3-element Array{Int64,1}:
2
3
4