我有一个大的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]