2016-03-01 78 views
5

到目前爲止,您對我的幫助非常大,希望您能幫我解開這個問題。我正在構建一個用複雜矩陣進行計算的項目。我一直在使用mikera/core.matrix.complex,它使用mikera/core.matrix作爲矩陣材料,而complex.core用於在clojure中定義複數。在Clojure項目中將複雜算術設置爲默認值

我希望能夠做任何和所有的算術運算,包括使用非理性的數字,如e (def e (Math/E))和pi (def pi (Math/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.complex而不需要core.matrix,那麼沒有任何矩陣函數可以工作。

這同樣適用於像(+ 3 4)東西。如果我直接(use 'complex.core)在一個repl,那麼將評估爲(7.0, 0.0),這是我想要的,否則它只是出來作爲7.

我覺得我讓這更復雜,比它,核心。 matrix.complex看起來像它具有core.matrix和clojure.core中所有內容的擴展,但它沒有將它用於我擁有的命名空間聲明。我對Clojure協議並不熟悉,所以肯定會丟失一些東西。我只想包含所有三個庫,並有任何和所有的數學在複數的情況來進行,即1 =(1.0,0.0),和(Math/exp (* pi (complex 0 1)) => (-1.0, 0.0)

我怎麼能去這樣做?對不起,如果我不清楚,我會嘗試清除人們對我所問的任何問題。

編輯:我一直在思考這個問題,並真正開始最好的地方是我列出的最後一個等式:獲得E 1 PI *我等於-1。如果我嘗試使用複數Math/exp,我會得到一個轉換異常。

回答

1

我不熟悉core.matrix.complex,但這裏有一些你可能不知道的點。這在技術上不是一個答案,但是在評論中修復時間太長。

  1. core.matrix定義一組API,在協議的形式,定義here

  2. core.matrix.complex不是extend複雜矩陣的所有協議。例如,mat/mmul定義爲here依賴於協議PMatrixMultiply。但是這個協議並沒有擴展到複雜的矩陣。

  3. (+ 3 4)回報(7.0, 0.0)使用 -ing complex.core因爲complex.core重寫功能/操作+。但我懷疑你是否應該引用這些運營商。 complex.core僅僅是一個圍繞org.apache.commons.math3.complex.Complex的薄包裝,它對矩陣一無所知。也許你會更好地使用core.matrix API中的函數/運算符,如add