我有一个三维数组,定义如下:
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赋值吗?
发布于 2020-12-30 02:41:21
在Julia中发生了很多变化,我想我应该更新这个答案以反映Julia 1.5 (可能大多数更改是1.0)。虽然我希望现代的x[:, :, k]能够工作,因为它仍然被称为SubArray,实际上是在表达式中复制。相反,您必须使用view()
x= zeros(2, 2, 2)
function init!(y)
y[:]= ones(size(y))
end
init!(view(x, :, :, 1)) # get reference to original items这将为您提供所需的结果:
julia> x
2×2×2 Array{Float64,3}:
[:, :, 1] =
1.0 1.0
1.0 1.0
[:, :, 2] =
0.0 0.0
0.0 0.0也有帮助器宏,用于以更容易接受的形式编写它,
init!(@view x[:,:,1])但是,如果您有其他论点,则可能会出现贪婪宏解析的危险,例如
otherfunc!(@view x[:,:,1], 10)会给你一个错误的Invalid use of @view macro: argument must be a reference expression。为了解决这个问题,有一个杂乱无章的@views,它把所有的_SubArray_s都变成视图,或者你也可以把参数放在括号里。
otherfunc!(@views x[:,:,1], 10)
otherfunc!(@view( x[:,:,1]), 10)您可以在以下演示文稿中找到有关处理数组和矩阵的更多信息:(Youtube) Arrays: slices and views
https://stackoverflow.com/questions/32465746
复制相似问题