Julia中的重叠数组-带指针的解决方案



我有一个大的Float64数组x,通常在更改该切片之前,将其切片视为矩阵。我可以把这个切片称为y吗?它已经有了正确的形状。至

x=zeros(10000)
y=x[10:18]
reshape!(y,(3,3))
y=y+eye(3) # this doesn't change x

这在x[10:18]创建副本时不起作用。我看了一下pointer_to_array,但没能算出。

在julia中生成无拷贝切片的常用工具是SubArrays:

x = zeros(10000)
y = sub(x, 10:18)

现在改变CCD_ 5将改变x的相应元素。(您也可以使用slice,它在高维数组中的表现不同(。

也可以使用y = sub(x, A),其中A是索引数组。不幸的是,reshape(y, 3, 3)通过将SubArray转换为Array来生成值的副本(目前在Julia 9874期中讨论过,因此将来可能会更改(。将y = sub(x, A)A一起使用正确形状的索引矩阵是不起作用的。

也许对于您的特定应用程序,进行就足够了

x = zeros(10000)
y = sub(x, 10:18)
y[:] += vec(eye(3))

它可以根据您的需要改变x,而不会产生不同形状的切片。

我想以下内容可以完成任务:

y = pointer_to_array( pointer( x, 10 ), (3,3) )   # make a slice starting from the 10th element

例如,这可以作为进行测试

x = zeros( 8 )
p = pointer_to_array( pointer( x, 3 ), (3,2) )
p[:,1] = 100.0
p[:,2] = 200.0
@show x    # => [ 0.0, 0.0, 100.0, 100.0, 100.0, 200.0, 200.0, 200.0 ]

如果x的大小是切片大小的倍数,那么reshape((也可以直接用于修改切片。例如,

x = [ i for i=1:8 ]
s = reshape( x, (2,2,2) )
s[:,:,2] = 1000
@show x      # => [1,2,3,4,1000,1000,1000,1000]

相关内容

最新更新