4

線形代数用の Java ライブラリはたくさんありますが、Clojure には現在、記号演算のサポートを含む慣用的なコンピューター代数システムがありません。手始めに、簡単なことに取り組み始めることができると思います。

最初のステップとして、データ構造を正しくすることが良いスタートになると思います。

ステップ 1: 永続的なマトリックスを実装する

deftype(または)を使用reifyしますが、今のところ、実装を容易にするために、ストレージにハッシュマップを使用します (そのほうがよいと思われるが、トレードオフがある場合は別の方法を提案してください)。(配列の使用、外部 Java ライブラリへの委任、ある種のトランジェント インターフェイスの実装など、パフォーマンス要件に応じてさまざまな実装を想像できます。)

私の質問は、どのインターフェイス/プロトコルを実装することを検討すべきですか? (一般に、clojure が使用するすべてのプロトコル/インターフェースの適切なリストは何ですか?) また、これらの実装方法に関するアドバイスはありますか?

実装する私のリスト:

-不変の方法でマトリックスのセクションを変更するには、関連付けが役立ちます

-行列を要素のアクセサーとしての関数として扱い、2つのタプルを渡して単一の要素、単一の値(幅* y + xによるインデックス)、ハッシュマップを渡して列、行を取得できると考えていました。またはマイナー、カスタム クエリ ハッシュマップ/言語を介して。

現時点での私の目標は、実装を柔軟に選択できるようにする優れた抽象化を設計することです。

4

5 に答える 5

2

私は多かれ少なかれ、主要な Python シンボリック パッケージであるSymPyの線形代数モジュールを管理しています。従来のコンピューター代数システムから得た私の視点を紹介します。

3 つの重要なユース ケースに対して 3 つの個別の実装があります。

  1. 可変行列 -- Python であるにもかかわらず、SymPy はデフォルトで不変です。実際、行列についてはこの規則を破っています。マトリックス アルゴリズムは、パフォーマンス上の理由から実際に可変性に切り替える必要がある標準的な例です。
  2. 不変の行列 -- しかし、元に戻すオプションが必要です。意図したワークフローは次のとおりです。

    1. 不変のマトリックスを構築する
    2. 可変性に切り替えて、いくつかのアルゴリズムを実行します
    3. 不変性に戻り、これをユーザーに提示します
  3. 行列記号 -- 行列の明示的なエントリを扱う必要はなく、むしろ行列の概念を扱いたい場合がよくあります。このscicomp.stackexchange の投稿を参照してください。これは私の現在の仕事であり、非常にエキサイティングだと思います。

密な表現と希薄な表現のような他の分割があります。記号線形代数は大きく重要な分野です。Clojure コミュニティの集合的なソリューションが見られることを楽しみにしています。

于 2012-11-17T13:41:53.233 に答える
1

Java ライブラリですが、Vectorzを Clojure から使えるように設計しました。

高性能のベクトルおよび行列演算用の多くのデータ構造とアルゴリズムを提供します。役に立つかもしれません。私は現在、Clojure でコンピューター グラフィックスと機械学習の両方に使用しています。

行列とベクトルは可変ですが、これは必要悪であることがわかりました。不変のベクトルと行列を使用すると、多くのアルゴリズムにとって単純に遅すぎます。

十分な数の人々がこれを便利だと思うか、関与したいと思うなら、慣用的な clojure ラッパー (ベクトルと行列の不変バージョンを含む) を構築することに興味があります。

于 2012-11-17T10:06:54.703 に答える
0

MPLは、ポータブルR6RSスキームで記述された単純な記号数学ライブラリです。ここに簡単な紹介があります。

SchemeはLispであるため、MPLはClojureに移植するのが非常に簡単です。

于 2012-12-09T04:56:41.947 に答える
0

これはあなたの質問への回答ではないかもしれませんが、Incanter を使用しているときにわかったことの 1 つは、ラップアラウンドを使用して要素にアクセスできるようにする必要があるということでした。ベクトルの場合も同様です。負のインデックスを指定して最後から逆方向に要素にアクセスしたり、範囲外のインデックスを指定して最初から要素にアクセスしたりできると便利な場合があります。オフセットを自然に計算するとオーバーヘッドが追加されますが、それはあなたが支払っても構わないと思っている機能です

于 2012-11-19T05:35:12.517 に答える