2016-12-28 200 views
1

我想重塑一個函數內的矩陣,所以我「聲明」了一個函數外的數組,並在函數中使用了reshape()。即使數組是可變的,它也不會工作。爲什麼Julia中的reshape()不會改變函數中數組的內容?

julia> my_array = 1:10 
1:10 

julia> function test(array) 
      array = reshape(array, 2, 5) 
      println(array) 
     end 
test (generic function with 1 method) 

julia> test(my_array) 
[1 3 5 7 9; 2 4 6 8 10] 

julia> println(my_array) 
1:10 

在函數內的,my_array已經再成形爲一個2 * 5矩陣,但它執行功能之後恢復1:10。

我想知道背後的原因,以及如何重塑形狀內的全局數組?

編輯:我的問題不同於variable references in lisp,我知道將變量副本傳遞給堆棧的想法。對於這個問題,我不知道爲什麼特定函數reshape()不會更改數組的內容,即使我傳遞了可變對象的引用。

+0

[Lisp的變量引用]的可能的複製(http://stackoverflow.com/questions/1249991/variable -references-in-lisp) – Kaz

回答

3

我想知道背後的原因,以及如何重新塑造函數內的全局數組?

reshape荷蘭國際集團一般沒有穩定的類型,如果它是可變的:在這裏,你表明你改變一個載體導入矩陣,所以類型將不得不改變。這就是爲什麼reshape返回而不是變異,因爲類型穩定性對Julia編程非常重要。

但是,reshapeactually returns a view,所以你可以檢查v = reshape(A,...)實際上並沒有複製任何數據:它只是創建一個新的類型,它定義了一個新的索引方案。由於數組是通過引用(即通過指針)傳遞的,因此返回reshape d類型實際上沒有成本。因此,爲了得到你想要的性能沒有問題的行爲,得到的答覆是正好趕上返回類型:

function test(array) 
    array = reshape(array, 2, 5) 
    array 
end 
reshaped = test(array) 
+1

除了Chris的註釋之外,另一個問題是你傳遞了一個'UnitRange',所以如果你試圖在重新構造它之後修改傳入數組的值,那麼它會不行。 –

3

docs

假設你叫這樣的功能:

julia> x = 10 
10 

julia> function change_value!(y) 
      y = 17 
     end 
change_value! (generic function with 1 method) 

julia> change_value!(x) 
17 

julia> x # x is unchanged! 
10 

在朱莉婭的變量x的結合不能被傳遞x 作爲參數傳遞給一個改變功能。當在 上面的例子中調用change_value!(x)時,y是新創建的變量,最初綁定到的 值,即10;那麼y被反彈到常數17,而外部範圍的 變量x保持不變。

因此,您不能通過重新分配函數中傳遞的值來重新分配變量。

話雖這麼說,一些收藏允許突變(但仍沒有重新分配):

julia> function mut(x) 
     x[1] = 100 
     end 
mut (generic function with 1 method) 

julia> a = [1,2,3] 
3-element Array{Int64,1}: 
1 
2 
3 

julia> mut(a) 
100 

julia> a 
3-element Array{Int64,1}: 
100 
    2 
    3 

如果你想改變數組本身,讓你可以使用一個元組返回多個值一些其他的答案:

julia> function dubSum(x) 
      x = hcat(x,x) 
      sum_val = sum(x) 
      return (x, sum_val) 
     end 
dubSum (generic function with 1 method) 

julia> x = [1,2,3] 
3-element Array{Int64,1}: 
1 
2 
3 

julia> x, sum_val = dubSum(x) 
(
3x2 Array{Int64,2}: 
1 1 
2 2 
3 3, 

12) 

julia> x 
3x2 Array{Int64,2}: 
1 1 
2 2 
3 3 

julia> sum_val 
12 
相關問題