2016-03-01 74 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