我有一个三维数组,定义如下:
x=zeros(Float64,2,2,2)我希望通过将x传递给一个函数,一次一层地将1赋给x。该函数为:
function init(p,y)
y=ones(p,p)
end我将按如下方式传递x:
for k=1:2
init(2,x[2,2,k])
end但是当我这样做的时候,x是0,而不是1。为什么?
julia> x
2x2x2 Array{Float64,3}:
[:, :, 1] =
0.0 0.0
0.0 0.0
[:, :, 2] =
0.0 0.0
0.0 0.0你知道怎么让朱莉娅给x赋值吗?
发布于 2015-09-09 21:39:01
一种可能的解决方案是使用slice,它制作了一个SubArray
x = zeros(2, 2, 2) # Float64 by default
function init!(y)
y[:] = ones(y) # change contents not binding
end
for k in 1:2
init!(slice(x, :, :, k)) # use slice to get SubArray
end请注意,您可以使用ones(y)来获取与y大小相同的向量。
SubArray提供了数组的视图,而不是副本。在未来的Julia版本中,默认情况下,索引数组可能会提供此功能,但目前您必须显式执行此操作。
有关值与绑定的讨论,请参见
http://www.johnmyleswhite.com/notebook/2014/09/06/values-vs-bindings-the-map-is-not-the-territory/
编辑:我没有看到@tholy的答案,它包含了同样的想法。
发布于 2015-09-09 16:15:55
我也不确定我是否理解了这个问题,但slice(x, :, :, k)将从x中分到2d部分。
如果您将x初始化为Float64的数组,然后希望为每个元素分配一个矩阵(这似乎是您正在尝试做的),那么这是行不通的- x的类型不允许这样做。您可以使x成为一个Any数组,然后这将是允许的。
发布于 2015-09-09 08:41:45
我不确定我是否理解,但是如果你想修改x的位置,你会想做一些不同的事情。
下面的代码应该可以做你需要的事情。
x = zeros(Float64, 2, 2, 2)
function init!(p, y, k)
y[:, :, k] = ones(Float64, p, p)
end
for k = 1:2
init!(2, x, k)
end您可能还想记住,Julia中的标准约定是在修改其参数的函数的名称中包含一个感叹号。如果我理解了您的问题,那么您希望您的init!()函数能够做到这一点。
https://stackoverflow.com/questions/32465746
复制相似问题