2015-09-05 21 views
1

我有一个大的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,但我无法解决这个问题。

回答

1

我想下面将做的工作:

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] 
+2

@warsaga我已经尝试了一些更多的关于这一点,似乎没有界限检查新的数组维度(即“不安全”)https://github.com/JuliaLang/julia/blob/master/base/ pointer.jl#L33所以请谨慎使用此...我想知道是否可以使用其他(更安全)的方法(如子数组和阵列视图) – roygvib

3

在朱产生不复制片的通常的工具是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

+0

最后一行('y + = vec(eye(3) )''不*改变'x',因为它相当于'y = y + vec(eye(3))',它将一个* new *对象赋给'y'。 –

+0

你是对的@ DavidP.Sanders;我打算把'y [:]'放在lhs上。固定。 – Maxim