gpt4 book ai didi

julia - Julia中二维向量数组的特殊行为

转载 作者:行者123 更新时间:2023-12-03 20:22:49 25 4
gpt4 key购买 nike

我想创建一个二维向量的二维数组(代表一个向量场)。
我的代码是这样的

N=10
dx=1/(N-1)
dy=1/(N-1)

#initial data
U=fill(zeros(2), (N, N))

for i=1:1:N
for j=1:1:N
U[i,j][1]=(i-1)*dx
U[i,j][2]=(j-1)*dy
end
end

print(U[5, 7])
结果是 [1.0, 1.0],这不是我想要的。我不知道为什么。但是,如果我将代码更改为这样的
N=10
dx=1/(N-1)
dy=1/(N-1)

#initial data
U=fill(zeros(2), (N, N))

for i=1:1:N
for j=1:1:N
U[i,j]=[(i-1)*dx, (i-1)*dx]
end
end

print(U[5, 7])
然后它打印出正确的结果,即 [0.4444444444444444, 0.6666666666666666]。那么,怎么回事?

最佳答案

这种行为是预期的。请注意以下事项:

julia> x = fill(zeros(1), 2)
2-element Array{Array{Float64,1},1}:
[0.0]
[0.0]

julia> x[1][1] = 5.0
5.0

julia> x[2][1]
5.0
我设法改变了 x[2][1]只需更改 x[1][1] .此时您可能会猜到问题所在。您正在使用相同的向量填充矩阵的所有元素。因此,当你变异一个时,你就是在变异所有。
要获得您想要的行为,您可以像这样构建初始矩阵:
x = [ zeros(2) for n in 1:N, m in 1:N ]
这里的关键是考虑您的 fill 的第一个参数是否call 是或包含一个可变的。如果没有,那么它将像您预期的那样工作,例如 fill(0.0, 2) .但如果它确实包含一个可变的,那么 fill 的输出将包含指向单个可变对象的指针,您将获得上面遇到的行为。
请注意,我在这里使用“包含”一词很重要,因为包含可变对象的不可变对象(immutable对象)仍将导致指向单个可变对象的指针,从而导致您遇到的行为。例如:
struct T1 ; x::Vector{Float64} ; end
T1() = T1(zeros(1))
x = fill(T1(), 2)
x[1].x[1] = 5.0
x[2].x[1]
仍然会改变 x 的第二个元素.

关于julia - Julia中二维向量数组的特殊行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67896872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com