2015-09-05 55 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