在Julia中使用2d函数值填充数组

时间:2019-11-02 00:11:34

标签: arrays julia

我想知道在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

还是我必须明确地写出循​​环?

2 个答案:

答案 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