2017-02-20 81 views
4

如果我做爲什麼Matrix上的'sum'返回矩陣,而不是Vector?

mat = rand(8,8) 
sum(mat, 1) 

返回類型是一個單列矩陣,而sum(mat, 2)給出了一列的矩陣。這令我感到驚訝,因爲singleton維度通常是0.5,所以我期望這兩種操作的返回類型都是Vector。爲什麼singleton維度不會在這裏下降?

我可能認爲這是爲了保留方向(例如sum(mat, 1)是一個行向量),但行爲在0.6上是一樣的,它有明確的一維RowVectors,所以這看起來不是一個解釋。

謝謝!

回答

4

是的,像sum這樣的縮小保留了數組的維數。這是故意的,因爲它可以將結果廣播回原始數組。這意味着,你可以,例如,規範數組的列與./

julia> A = rand(1:100, 4, 3) 
4×3 Array{Int64,2}: 
94 50 32 
46 15 78 
34 29 41 
79 22 58 

julia> A ./ sum(A, 1) 
4×3 Array{Float64,2}: 
0.371542 0.431034 0.15311 
0.181818 0.12931 0.373206 
0.134387 0.25  0.196172 
0.312253 0.189655 0.277512 

在二維情況下,可能能夠通過RowVector s爲單位進行處理,這種做法並沒有推廣到更高的層面。

也就是說,還有其他情況下,放置尺寸be similarly useful。這是一個open design question on the issue tracker

+0

不錯,謝謝!我確實想過這個廣播,但並不是說它不會推廣到更高的尺寸。我看到了這個問題,所以,謝謝! 這是因爲我在矩陣的行和列總和上定義了函數,並且將輸入參數定義爲「Vector」似乎很自然,但這意味着我必須調用,例如, 'myfunc(vec(sum(mat,1)))',看起來很笨拙。但讓參數成爲矩陣似乎可能會導致問題。不過,我想我可以用調度來解決這個問題。 –

+1

通常不需要嚴格限制參數類型。除了'Vector'之外,你幾乎可以肯定地使用'AbstractVector' - 它將包含視圖和重構的矢量以及許多其他自定義矢量類型。在所有維度上甚至比「Any」更普遍。當然,傳遞一些無意義的東西可能會比你想象的要晚一些,但它可以讓某個人傳遞一些[看起來像鴨子]的東西(https://en.wikipedia.org/wiki/Duck_typing#In_Julia)和它仍然會嘎嘎響。 –

+0

謝謝,是的,我同意通常不需要限制函數參數(和重要的內部類型)中的類型,我喜歡這個原則!另外,我確實使用了AbstractVector(對不起)。但是,在這種情況下,行矩陣和列矩陣與Vector有不同的行爲(例如,當傳遞給像'size'這樣的函數時),如果我忽略了維度,它可能不會導致意外的錯誤?最後,我沿着'f(x :: AbstractMatrix)= f(vec(x))做了一些事情; F(X :: AbstractVector)...' –

相關問題