【发布时间】:2016-03-01 17:52:32
【问题描述】:
到目前为止,您对我的帮助非常大,我希望您能帮助我解决这个问题。我正在构建一个使用复杂矩阵进行计算的项目。我一直在使用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 [+ - / *]]))
如果我使用(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) 之类的内容也是如此。如果我在 repl 中直接(use 'complex.core),那么它将评估为(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 与复数一起使用,则会出现强制转换异常。
【问题讨论】:
标签: math matrix clojure complex-numbers