很多东西在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))
这将为您提供所需的结果:
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)
如果你使用了无效的@view宏,会出现错误Invalid use of @view macro: argument must be a reference expression
。为了解决这个问题,有一个临时的方法是使用@views
将所有的SubArray转换成视图,或者你可以将参数用括号括起来。
otherfunc!(@views x[:,:,1], 10)
otherfunc!(@view( x[:,:,1]), 10)
您可以在此演示文稿中找到有关数组和矩阵操作的更多信息:
(Youtube) 数组:切片和视图
init
函数中被修改,这就是问题所在。 - Ferenc