到目前为止,您对我的帮助非常大,希望您能帮我解开这个问题。我正在构建一个用复杂矩阵进行计算的项目。我一直在使用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,我会得到一个转换异常。