2016-03-01 8 views
5

あなたはこれまで私が驚くほど役に立つと思っています。私は、複雑な行列を使って計算を行うプロジェクトを構築しています。私はmikera/core.matrix.complexを使用していました。これは、マトリクス用にmikera/core.matrix、クロージャに複素数を定義するのにcomplex.coreを使用しています。Clojureプロジェクト内でComplex算術演算をデフォルトにする

私は、(def e (Math/E))やpi のような非合理的な数字を使用したり、複雑かもしれないし、そうでないかもしれない行列の数学を含めて、あらゆる演算を行うことができます。問題は、異なるライブラリの関数を混在させるときに発生します。

は今のところ私の名前空間には、次のようになります。

(ns qgame.utils.math 
(:require 
     [clojure.walk :as w :refer [postwalk 
            prewalk]] 
     [clojure.core.matrix :as mat] 
     [clojure.core.matrix.complex :as compl] 
     [incanter.core :as ic] 
     [complex.core :as c :refer [+ -/*]])) 

私は(mat/mmul matrix1 matrix2)を行う場合は、すべてが通常の数として扱われ、複素数を使用すると、それを台無しにされています。私は多くのClassCastException org.apache.commons.math3.complex.Complex cannot be cast to java.lang.Numberを取得します。 core.matrixを必要とせずにcore.matrix.complexが必要な場合は、どの行列関数も動作しません。

(+ 3 4)と同じものになります。私が直接(use 'complex.core)をreplにした場合、それは(7.0, 0.0)と評価されます。そうでなければ、それは7になります。

私はこれがコアよりも複雑になっているように感じます。 matrix.complexはcore.matrixとclojure.coreのすべての拡張を持っているようですが、私が持っている名前空間宣言ではそれを利用していません。私はClojureプロトコルに精通していないので、間違っているものがあります。 3つのライブラリをすべて組み込み、すべての数学を複素数の文脈で行うことを望みます。つまり、1 =(1.0,0.0)、(Math/exp (* pi (complex 0 1)) => (-1.0, 0.0)

どうすればいいですか?申し訳ありませんが、私は明確ではない場合、私はしようとし、人々が私が求めていることについての質問をクリアします。

編集:私はこの問題について考えてきましたが、実際に開始するのに最適な場所は、私がリストした最後の式です。e^pi * iを-1にする。複素数でMath/expを使用しようとすると、キャスト例外が発生します。

答えて

1

私はcore.matrix.complexに慣れていませんが、あなたが気づいていない点がいくつかあります。これは技術的には解答ではありませんが、コメントで修正するには時間がかかりすぎます。 APIのセットを定義

  1. core.matrix、プロトコルの形で、hereを定義しました。

  2. core.matrix.complexextend複雑なマトリックスに対するすべてのプロトコル。例えば、mat/mmulhereと定義されており、プロトコルPMatrixMultiplyに依存しています。しかし、このプロトコルは複雑な行列に拡張されていません。

  3. (+ 3 4)戻り(7.0, 0.0)機能/オペレータ+を書き直しcomplex.corecomplex.coreため使用が-ing後。しかし、これらの演算子を参照する必要があるかどうかは疑問です。 complex.coreは、単にorg.apache.commons.math3.complex.Complexのまわりの薄いラッパーであり、行列については何も知らない。おそらく、addのようなcore.matrix APIの関数/演算子を使用する方が良いでしょう。