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