2014-01-16 41 views
11

在Julia中,如果我定義了一個具有1列和n行的數組,它似乎實例化了一個「n元素數組」,我不明白這與nx1數組:Julia的nx1陣列和n元素數組之間的區別

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

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

令人困惑的是,如果我走轉一個正元件陣列的兩倍,返回的結果是一個NX1數組:

julia> transpose(transpose(b)) 
3x1 Array{Int64,2}: 
1 
2 
3 

這導致像一些意想不到的(對我)的行爲:

julia> size(b) == size(transpose(transpose(b))) 
false 

我的問題:

  1. 是什麼NX1陣列和n個元素的數組之間的區別?
  2. 如何創建一個nx1數組,而不需要執行類似我給出的雙轉置示例。

回答

17

快速解答:

  1. 一種n X1或1x n陣列是2維矩陣(即恰好僅具有一行或一列),而你正元件陣列是一個1維列向量。
  2. 我認爲最簡單的方法來創建一個n x1陣列文字正在採取行矢量的轉置:[1 2 3]'。換句話說,您可以使用vec將任何n維陣列平坦化爲1維向量。

它更有益的,不過,想想爲什麼這個問題。 Julia的類型系統設計完全基於類型,而不是值。數組的維度包含在其類型信息中,但行數和列數不是。因此,nx1矩陣和n元素向量之間的區別在於它們具有不同的類型......並且類型推斷引擎無法看到矩陣只有一列。

爲了獲得Julia的最佳性能,您(尤其是核心語言和庫設計者)想要編寫的功能是類型穩定的。也就是說,函數應該能夠根據參數的類型推導出它們將純粹返回的類型。這允許編譯器通過函數跟蹤變量,而不會丟失類型的跟蹤......這反過來又允許它爲該特定類型生成高度優化的代碼。

現在,再考慮轉置。如果你想要一個類型穩定的轉置函數,它必須返回至少一個二維數組。如果其中一個維度爲1,並且仍然保持良好的性能,它根本無法做到棘手。儘管如此,關於郵件列表和GitHub問題中的向量轉換還有很多討論。這裏是開始的好地方:Issue #2686: ones(3) != ones(3)''。或者對相關問題進行更深入的討論:Issue #3262: embed tensor-like objects as higher-dimensional objects with trailing singleton dimensions。兩者最終都被取代並滾入Issue #4774: Taking vector transposes seriously


更新朱莉婭0.6:朱莉婭現在只需矢量調換非常認真!向量轉置現在返回一個特殊的RowVector類型,其行爲類似於1行矩陣,但具有隻有一行的額外知識。這也是對原始矢量的懶惰「視圖」。通過問題中的示例,這意味着不僅size(b) == size(transpose(transpose(b)))爲真,還包含b'' === b

指定在Julia 0.6中更改維度的重塑操作也更容易一些。上面問題2的一個很好的答案(創建一個nx1數組)與reshape([1,2,3], :, 1)。計算由:指定的維度以匹配源數組的長度。

相關問題