2016-09-13 3 views
1

DenseMatrixクラスには、Array [V]型のパラメータデータがあります。 Vectorのように、動的に成長する可能性がある他の可変コレクションを使用しないのはなぜですか?Breezeで行列を表すために配列が使用されるのはなぜですか?

+1

ちょうど推測:ネイティブライブラリ(JNI)との通信はArraysで行う必要があるため、AFAIKではネイティブコードに任意のコレクションを渡すことはできません。 –

+0

おそらく配列が最も速いからです。そして、なぜマトリックスは動的に成長する必要がありますか?行列は常に固定次元ではありませんか? –

+0

@Raphael Roth返信ありがとうございます.JNIと通信するDenseMatrixのいくつかの方法を指摘できますか? –

答えて

2

コメント(Raphael RothとJasper-Mのコメント)はどちらも良い点を示しており、どちらもその理由の一部です。 Breezeは、JNI経由でネイティブBLASへのインターフェイスを処理するためにnetlib-javaを使用し、配列を使用します。 (これはJavaのバッファで実装されていた可能性がありますが、そうではありませんでした)。DenseMatricesの動的サイズ変更はあまり意味がなく、DMとDVの実装は意図的に似ています。

配列には、JavaやScalaの他の組み込みコレクションのようなものよりも優れたパフォーマンス特性があり、Breezeは高速であることを気にしているので、これが最良の選択です。 scalaおよびjava boxプリミティブ要素の両方にあるすべてのジェネリックコレクション。パフォーマンスに影響されない環境ではまったく受け入れられません。 (私はScalaの特化したものを使って独自のArrayBufferをロールバックすることもできましたが、そうしませんでした)また、java Vectorはすべてのアクセスを同期させるため、実際にロックを必要としない限り特に受け入れられません。

データセットの次元が不明な場合は、VectorBuilder(設定可能な長さパラメータがあり、-1に設定して境界チェックをオフにすることができます)を使用できます。

+0

詳細な回答ありがとうございます。私はあなたが説明していたものをチェックしましたが、今はArrayを選択した理由を理解しています(netlib-javaにはあまりよく慣れていませんが、ライブラリは私が思ったよりもすばらしいと思われます)。 –

関連する問題