我希望能够执行任何和所有算术,包括使用非理性数字,如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.
我觉得我让它变得比这更复杂,core.matrix.complex看起来像是在core.matrix和clojure.core中有所有内容的扩展,但它没有将它与命名空间声明一起使用我有。我对Clojure协议并不熟悉,所以我肯定会遗漏一些东西。我只想要包含所有三个库,并且要在复数的上下文中完成所有数学,即1 =(1.0,0.0)和(Math/exp (* pi (complex 0 1)) => (-1.0, 0.0)
我该怎么做呢?对不起,如果我不清楚,我会尝试澄清人们对我所问的问题。
编辑:我一直在考虑这个问题,真正最好的起点是我列出的最后一个等式:让e ^ pi * i等于-1。如果我尝试使用具有复数的Math / exp,我会得到一个转换异常。
答案 0 :(得分:1)
我对core.matrix.complex并不熟悉,但这里有一些你可能不知道的要点。这在技术上不是一个答案,但是在评论中修复它太长了。
core.matrix
定义了一组API,以协议的形式定义here。
core.matrix.complex
不会extend复杂矩阵的所有协议。例如,mat/mmul
定义的here依赖于协议PMatrixMultiply。但是这个协议没有扩展到复杂的矩阵。
(+ 3 4)
在使用 -ing (7.0, 0.0)
后返回complex.core
,因为complex.core
重写了函数/运算符+。但我怀疑你是否应该引用这些运算符。 complex.core
只是org.apache.commons.math3.complex.Complex
的一个薄包装器,它对矩阵一无所知。也许你最好在core.matrix
API中使用函数/运算符,例如add。