将二维数组传递给julia中的函数

Ama*_*mal 5 arrays julia

我有一个三维数组定义为:

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谁?

Dav*_*ers 6

一种可能的解决方案是使用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的答案,其中包含相同的想法.


tho*_*oly 5

我也不确定我是否理解这个问题,但是slice(x, :, :, k)需要2分x.

如果你正在初始化x为一个数组,Float64然后希望为每个元素分配一个矩阵(这就是你想要做的事情),那将无法工作--- x不允许它的类型.你可以制作x一个数组Any,然后就可以了.


pau*_*tey 3

我不确定我是否理解,但如果您尝试就地修改 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!()函数能够做到这一点。