我有一个三维数组定义为:
x=zeros(Float64,2,2,2)
Run Code Online (Sandbox Code Playgroud)
我想x
通过传递x
给一个函数,一次一层来分配.功能是:
function init(p,y)
y=ones(p,p)
end
Run Code Online (Sandbox Code Playgroud)
我将通过x
如下通知:
for k=1:2
init(2,x[2,2,k])
end
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,x
是零,而不是那些.为什么?
julia> x
2x2x2 Array{Float64,3}:
[:, :, 1] =
0.0 0.0
0.0 0.0
[:, :, 2] =
0.0 0.0
0.0 0.0
Run Code Online (Sandbox Code Playgroud)
知道如何让朱莉娅分配给x
谁?
一种可能的解决方案是使用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
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用ones(y)
以获取与其大小相同的向量y
.
A SubArray
给出了数组的视图,而不是副本.在Julia的未来版本中,索引数组可能会默认提供此功能,但目前您必须明确地执行此操作.
有关值与绑定的讨论,请参阅
http://www.johnmyleswhite.com/notebook/2014/09/06/values-vs-bindings-the-map-is-not-the-territory/
编辑:我没有看到@ tholy的答案,其中包含相同的想法.
我也不确定我是否理解这个问题,但是slice(x, :, :, k)
需要2分x
.
如果你正在初始化x
为一个数组,Float64
然后希望为每个元素分配一个矩阵(这就是你想要做的事情),那将无法工作--- x
不允许它的类型.你可以制作x
一个数组Any
,然后就可以了.
我不确定我是否理解,但如果您尝试就地修改 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
Run Code Online (Sandbox Code Playgroud)
您可能还想记住,Julia 中的标准约定是在修改其参数的函数名称中包含感叹号。如果我理解了你的问题,那么你希望你的init!()
函数能够做到这一点。