2016-11-07 10 views
0

通常、Scalaでは不変なコレクションを使用しようとしています。特に、コレクションの参照をプログラムの他の部分に渡すと、元のソースを偶然上書きすることができなくなります。 breezeを使用して、私は知りたい:DenseVectorを変更可能なコレクションにすることが決定したのはなぜですか?DenseVectorはなぜ可変コレクションですか?

これはバックグラウンドでの配列の使用の副作用ですか?その場合、別の(不変の)コレクションではなく、なぜArrayが使われたのですか?

答えて

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。それはArrayラップImmutableArrayをラップすることができ、これはその場でコピーすることによってコピーを避けることができ、いくつかの操作を強制するだろう、多分など、専門と不気味対話

  2. 私はこれがいかに重要であるかを知りません(私はそれほどのものではないと思う)が、(Scalaではなく)数値計算からBreezeに来る人にとって、変更可能性が期待されます。例えば。 MatlabまたはRで実装されているアルゴリズムをBreezeに移植する方が簡単です。

+0

2.私は右半分のようです: 'a = c(1,2);を実行します。 b = a; Rのa [1] = 0はaであり、aは0 2 3であり、bは1 2 3である。 Scalaの等価は、不変の 'var'です。 – Make42

+0

DenseVectorが不変の場合、 'a = a(1):= 0'と書く必要があります。 – Make42

+0

はい、Breezeはこの点でRやMatlab(IIRC)ではなくNumpyのように振る舞います。 R/Matlabユーザーも同様です。再び、私はこれが弱い理由であると思う(もしあれば)。 –

1

パフォーマンス。関数型プログラミングは優れた抽象化と厳密なコードを提供しますが、最も速い実行を提供することはしばしばありません。 Java配列は、Scalaコレクションよりもはるかに少ないオーバーヘッドを提供するため、非常に反復的な数値演算のための必要があります。 Breeze DenseVectorは同じ方法で、フードの下にあるJava配列によってサポートされています。

関連する問題