7

Clojureの行列の適切な表現は何ですか? 浮動小数点数の密な行列を扱うことに興味があります。「リストのリスト」表現が頭に浮かびますが、もっと良いものはありますか?

適切な表現の基準には次のものがあります。

  • 効率性: 巨大なデータ セットの継続的な処理には使用されませんが、より優れた設計であれば数分で実行できた結果の計算に何時間も費やしたくありません。
  • Java の相互運用性: 2 つの言語間でデータを簡単にやり取りできると便利です。
  • 簡単な並列化: に置き換えるだけで利用可能なすべてのコアを使用できればmappmapそれは素晴らしいことです。
  • の使用に適していますreduce: 私が行っている多くの計算は で非常にうまく機能しているようですreduce
  • マトリックス行で画像スキャン ラインを表現する機能: それほど重要ではありませんが、あると便利です。

何かご意見は?

4

8 に答える 8

10

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

于 2009-11-04T17:03:35.063 に答える
5

私は暫定的に Clatrix と呼ばれるjblasをラップするマトリックス ライブラリを作成しています。まだ追加したい多くの機能が欠けていますが、探しているもののほとんどが揃っています. http://github.com/tel/clatrixをご覧ください。

于 2012-04-30T22:47:05.790 に答える
4

ここで core.matrix の提案と実験的な実装を確認してください。

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

執筆時点では非常に初期の段階ですが、注目する価値があります。

于 2013-01-24T21:55:48.397 に答える
2

私は現在、cryptovideでリストのリストアプローチを使用しています。これは、このアプリケーションが物事を怠惰に保つために非常に重要だからです。また、少なくとも外向きの表現を怠惰に保つ限り、より効率的なアプローチに切り替えることを検討しています。

于 2009-11-04T17:45:09.913 に答える
0

Rich Hickey の Clojure は JVM ベースの Lisp であり、PersistentVector (PersistentList ではない) を 32 方向のツリーで表します。

独自の行列タイプを書きたい場合は、PersistentVector を使用します。それ以外の場合は、Parallel Colt と Incanter を使用することをお勧めします。

于 2010-02-23T13:30:09.883 に答える
0

私は最近、行列演算を必要とするいくつかのコードを書きました。最初は vector-of-vectors、map & reduce を使用しましたが、戻ったときに結果のコードを理解するのが難しいことがわかりました (私は Clojure の心に慣れていません)。Incanter は、同じコードを非常に簡潔で理解しやすく (標準の行列演算)、はるかに高速にしました。

于 2012-05-01T00:21:05.840 に答える
-1

私は専門家ではありませんが、とにかくここに私の意見があります:)

list-of-lists は、行列を表現するための最も自然な Clojure イディオムです。この構造は、さまざまな操作をマップ/削減するのにも適しています。Clojure は、シーケンスの処理においても非常に効率的です。おそらく、ほとんどの代替手段よりも優れています。

これを断言することはできませんが、Clojure が 3 つまたは 4 つすべての CPU を、私が書いたスタイルでは機能的であるが並列化を試みていないプログラムで一生懸命動かしているのを見たことがあると思います。コンパイラは、独自に並列処理の機会を見つけているのではないかと思います。

Clojure によって作成されたシーケンス型は、Java のリストとして機能するか、少なくとも Iterable になると思います。Java でこれらの構造を変更可能として処理しようとすると、問題が発生する可能性がありますが、おそらくそれで十分です。

リストは順番にアクセスするのが最適です。マトリックス内を頻繁に移動する予定がある場合は、ベクトルのベクトルの方がパフォーマンスの面で少し適している場合があります。n番目の関数を使用したほうがいいと思います。

以前 C プログラマーだった私は、行列を 1 次元構造 (つまり、直線シーケンスまたはベクトル) として実装し、適切な要素を見つけるために独自のインデックス計算を行うことができると簡単に考えました。パーティション関数を使用してそれをステップ実行できます...まあ、それは機能する可能性がありますが、そうしない非常に正当な理由があると思います。

于 2009-11-04T16:22:19.397 に答える