2009-11-04 7 views
7

Clojureの行列の良い表現は何ですか?浮動小数点数の密行列を扱うことに興味があります。 「リストのリスト」表現は心に浮かぶが、何か良いことがあるのだろうか?Clojure行列の表現

良い表現のためのいくつかの基準は、次のとおりです

  • 効率を:彼らは巨大なデータセットの一定の処理に使用されることはありませんが、私は行われている可能性があり、結果を計算する時間を費やす必要はありません。より良いデザインで分単位で。
  • Javaの相互運用性:2つの言語間でデータを簡単にやりとりすることができます。
  • 簡単並列化:mappmapに置き換えるだけで利用可能なすべてのコアを使用できる場合、それはいいと思います。
  • reduceの使用に適しています:私はreduceで非常にうまく動作しています。
  • マトリクス行のイメージスキャンラインを表す能力:それほど重要ではありませんが、持っているといいです。

+0

用に最適化されNeanderthalを見つけましたか?リストのリストとしてそれらを表現することは、いくつかの操作にとってまともな選択ですが、配列の恣意的な要素に頻繁にアクセスする必要がある場合は、あなたを死に至らしめるでしょう。 – Pillsy

答えて

10

Incanterは、Clojureのseqベースのライブラリとインターフェイスする、高速で並列化された密行列のかなり適切な実装と思われるものを含め、Parallel Coltのラッパーを提供します。私はそれを使用していないが、あなたが探しているものでなければならない。

Example

+1

注:この回答は古くなっています。 IncanterはClatrixを使用しています。さらに新しい高度なマトリックス実装が用意されています( 'core.matrix'と' vectorz-clj'などのさまざまな実装を参照)。 – mikera

-1

私は専門家だが、ここではとにかく私の意見です:)

リストの-リストはおそらく行列を表現するための最も自然なClojureのイディオムです。また、この構造は、操作の種類をマップ/縮小するのに適しています。 Clojureはシーケンスを処理するのにも非常に効率的です。おそらく、ほとんどの選択肢よりも優れています。

私はこれに誓うことはできませんが、Clojureが私のCPUの3つまたは4つすべてを、私が書いたプログラムでは難しいと思っていましたが、それは機能的でしたが、並行しようとはしませんでした。私は、コンパイラが並列処理のためのいくつかの機会を独自に見つけると思っています。

Clojureで作成されたシーケンスタイプは、Javaのリスト、または少なくともIterableで動作すると思います。 Javaでこれらの構造体を変更可能なものとして扱うと、問題に遭遇するかもしれませんが、これはおそらく十分です。

リストには、順番にアクセスするのが最適です。あなたが行列の周りを飛び回ることを計画しているなら、vector-of-vectorはあなたに少し良い、パフォーマンスに賢いかもしれません。私はそれがnth機能を使用して鼓動すると思う。

元のCプログラマーとして、行列を1次元構造(つまり、直線シーケンスまたはより良いベクトル)として実装し、正しい要素を見つけるために独自のインデックス計算を行うことを簡単に考えました。あなたはパーティションを使ってそれを進めることができます...うーん、それは働くことができるかもしれませんが、私はそこにはない非常に良い理由があると思われます。

2

私は現在、リストのリストをcryptovideで使用しています。このアプリケーションでは非常に重要な意味があるため、は怠けたままにします。私は、少なくとも外部表現が怠け者である限り、より効率的なアプローチに切り替えることも検討しています。

0

リッチHickeyのClojureは、PersistentVector(PersistentListではない)を32-wayツリーで表すJVMベースのLispです。

独自のマトリックスを作成したい場合は、タイプiはPersistentVector を使用します。そうでない場合は、Incanterで並列コルトを使用することをお勧めします。

5

私は、一時的にClatrixと呼ばれるjblasをラップする行列ライブラリを作成しています。私はまだ追加したい機能がたくさんありますが、あなたが探している機能のほとんどを持っています。見てください、http://github.com/tel/clatrix

0

私は最近行列の計算が必要なコードを書いていましたが、最初はvector-of-vectorsを使っていました。& map reduce、しかし私が戻ったときに結果のコードが分かりにくいことがわかりました(私はClojureの考え方が初めてです) 。 Incanterは、同じコードを非常に簡潔で分かりやすく(標準的な行列演算)、はるかに高速にしました。

4

チェックアウトcore.matrix案を+ここで実験的な実装:執筆時点で

https://github.com/mikera/matrix-api

非常に初期の頃、しかし目を保つ価値があります。

+2

2014年3月現在、これをかなり包括的な配列プログラミングシステムcore.matrixと呼ばれる – mikera

0

回答は8年経過した時点で更新する必要があります。クイックグーグル検索では、Clojure core.matrix APIとの互換性が必要な場合は、core.matrix自体またはvectorz-cljなどの他の実装を使用することができます。

はまた、私はあなたがこれらの行列をどうしたいん操作のどのようなGPU

関連する問題