Phy*_*lth 5 math clojure matrix complex-numbers
到目前为止,你对我非常有帮助,我希望你能帮我理解这个.我正在构建一个用复杂矩阵进行计算的项目.我一直在使用mikera/core.matrix.complex,它使用mikera/core.matrix作为矩阵内容,而complex.core则用于在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 [+ - / *]]))
Run Code Online (Sandbox Code Playgroud)
如果我这样做(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,我会得到一个转换异常.
我不熟悉 core.matrix.complex 但这里有一些你可能不知道的点。从技术上讲,这不是一个答案,但它太长,无法在评论中修复。
core.matrix定义了一组API,以协议的形式,定义在这里。
core.matrix.complex没有将所有协议扩展到复杂矩阵。例如,此处mat/mmul定义依赖于协议PMatrixMultiply。但该协议并未扩展到复杂矩阵。
(+ 3 4)使用-ing(7.0, 0.0)之后返回,因为重写了函数/运算符+。但我怀疑你是否应该推荐这些运营商。只是一个薄薄的包装,它对矩阵一无所知。也许您最好在API 中使用函数/运算符(例如add )。complex.corecomplex.corecomplex.coreorg.apache.commons.math3.complex.Complexcore.matrix