【问题标题】:Make Complex arithmetic the default within a Clojure project使复杂算术成为 Clojure 项目中的默认值
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2019-12-22
      • 1970-01-01
      相关资源
      最近更新 更多