2016-11-07 75 views
0

通常(到目前爲止)我嘗試在Scala中使用不可變集合,特別是如果我將集合的引用提供給我的程序的某個其他部分,我不能無意中覆蓋原始源。使用微風,我想知道:爲什麼決定讓DenseVector成爲一個可變的集合?DenseVector爲什麼是可變集合?

這只是一個(也許是不需要的)在後臺使用陣列的副作用?如果是這樣,爲什麼使用數組而不是另一個(不可變)集合?

回答

3
  1. 表現。

    Breeze uses netlib-java for its core linear algebra routines. This includes all the cubic time operations, matrix-matrix and matrix-vector multiplication. Special efforts are taken to ensure that arrays are not copied.

    由比陣列的任何其他支持的會大大緩慢甲DenseVector。它可以換一個ImmutableArray它包裝的Array,但是這將迫使一些操作可以通過就地複製爲避免拷貝,可能與專業化古怪的互動等

  2. 我不知道這是多麼重要(我懷疑不多),但對於從數值計算(而不是從Scala)來到Breeze的人來說,預計會出現可變性。例如。它使得將在Matlab或R中實現的算法移植到Breeze更簡單。

+0

2.我看起來只有一半:執行'a = c(1,2); B = A;在R中a [1] = 0,'a'將是'0 2 3',而b將是'1 2 3'。在Scala中相當於一個不可變的'var'。 – Make42

+0

雖然,如果DenseVector將是不可變的,我將不得不寫'a = a(1):= 0' – Make42

+0

是的,Breeze在這方面表現得像Numpy,而不是R或Matlab(IIRC),它可能最終導致混淆R/Matlab用戶也是如此。再次,我懷疑這是一個薄弱的原因(如果有的話)。 –

1

表現。雖然函數式編程提供了極好的抽象和嚴格的代碼,但它通常不會提供最快的執行。 Java數組提供的開銷遠遠低於Scala集合,因此是高度重複的數字操作的開始。微風DenseVector s是相同的方式,並在後臺java數組支持。