使复杂算术成为Clojure项目中的默认算法

时间:2016-03-01 17:52:33

标签: math matrix clojure 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 [+ - / *]]))

如果我(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,我会得到一个转换异常。

1 个答案:

答案 0 :(得分:1)

我对core.matrix.complex并不熟悉,但这里有一些你可能不知道的要点。这在技术上不是一个答案,但是在评论中修复它太长了。

  1. core.matrix定义了一组API,以协议的形式定义here

  2. core.matrix.complex不会extend复杂矩阵的所有协议。例如,mat/mmul定义的here依赖于协议PMatrixMultiply。但是这个协议没有扩展到复杂的矩阵。

  3. (+ 3 4)使用 -ing (7.0, 0.0)后返回complex.core,因为complex.core重写了函数/运算符+。但我怀疑你是否应该引用这些运算符。 complex.core只是org.apache.commons.math3.complex.Complex的一个薄包装器,它对矩阵一无所知。也许你最好在core.matrix API中使用函数/运算符,例如add