我有一个大的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
,但我无法解决这个问题。
我有一个大的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
,但我无法解决这个问题。
我想下面将做的工作:
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的大小是片大小的倍数,重塑()也可以直接用于修改切片。例如,
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]
在朱产生不复制片的通常的工具是SubArrays:
x = zeros(10000)
y = sub(x, 10:18)
现在改变y
将改变的x
的相应的元件。 (您也可以使用slice
,这与高维数组的行为不同)。您可以使用y = sub(x, A)
其中A是索引数组。不幸的是,reshape(y, 3, 3)
通过将SubArray转换为数组来生成值的副本(目前在Julia issue 9874中进行了讨论,以便将来可能会改变)。使用y = sub(x, A)
和A
正确形状的索引矩阵不起作用。
也许为具体应用,它是足够做
x = zeros(10000)
y = sub(x, 10:18)
y[:] += vec(eye(3))
,你想要它,而不产生不同形状的片而改变x
。
最后一行('y + = vec(eye(3) )''不*改变'x',因为它相当于'y = y + vec(eye(3))',它将一个* new *对象赋给'y'。 –
你是对的@ DavidP.Sanders;我打算把'y [:]'放在lhs上。固定。 – Maxim
@warsaga我已经尝试了一些更多的关于这一点,似乎没有界限检查新的数组维度(即“不安全”)https://github.com/JuliaLang/julia/blob/master/base/ pointer.jl#L33所以请谨慎使用此...我想知道是否可以使用其他(更安全)的方法(如子数组和阵列视图) – roygvib