Clojureのプラグ可能なベクトル処理ユニット
-
09-10-2019 - |
質問
Clojureでいくつかのシミュレーションソフトウェアを開発しており、多くのベクトルデータを処理する必要があります(基本的にはJavaフロートの配列にオフセットとして発信され、通常は10〜10000の範囲で長さ)。これらのベクトルの多数は、さまざまな処理手順を実行する必要があります。たとえば、ベクトルの正規化、ベクトルの2つのストリームを連結し、移動平均などを計算する必要があります。
すべてを命令的なスタイルで行うのではなく、私がやりたいと思っていたのは、以下を行うより機能的なスタイルのClojureソリューションを作成することでした。
- ベクトル関数をaに変えることを許可します プラグ可能なモジュール, 、EG(def module-a(Make-Module SomeFunction))
- これらのモジュールを許可します パイプラインで構成されています, 、例えば(def combined-module(combine-in-series module-a module-b))は、モジュールAの出力をモジュール-Bの入力に送ります
- 許可する 補助関数 特定のモジュール内に保存されている状態にアクセスするには、例えば(Get-Moverver-Averaver-Average-Module)。
- ボイラープレートコードを非表示にします 舞台裏では、たとえば、ベクター計算に十分に大きな一時アレイを割り当てます。
これは賢明なアプローチのように聞こえますか?
もしそうなら、実装は役立つかもしれないヒントやライブラリですか?
解決
機能的な言語では、すべてがデータフローです。関数をモジュールの概念として使用できます。
それぞれのユースケースに対処するには:
- a プラガンモジュール データベクトルの状態である単一の引数を取るClojure関数です。例えば
(def module-a some-function)
モジュールによる簡単な拡張を可能にするために、Clojureマップを状態として使用することをお勧めします。ここで、1つのフィールドはフロートの配列です。 - 構成モジュール 関数構成です。例えば
(def combined-module (compose module-a module-b)
- 補助関数 データから状態を抽出します。たとえば、データがClojureマップである場合
:moving-average
フィールド、次にキーワード:moving-average
アクセサー機能です。状態はモジュールに保存されていません。 - ボイラープレートコード 機能の実装に隠されており、おそらく別のファイルと名前空間で、どこでも宣言できます。
他のヒント
所属していません StackOverflow