You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ClojureScript中正确调用math.js的dot与inv函数?

在ClojureScript中正确调用math.js的dot和inv函数

问题说明

在ClojureScript中使用math.js时,调用math/dot和math/inv出现函数未定义错误,报错提示:

shadow.js.shim.module$mathjs.dot is not a function.
shadow.js.shim.module$mathjs.inv is not a function.

错误原因

  1. 导入方式与math.js导出结构不匹配:math.js的核心函数支持命名导入,默认导出对象可能因版本或打包方式,导致函数无法直接通过math/xxx的形式访问;
  2. 数据结构不兼容:ClojureScript的PersistentVector无法被math.js直接识别,需要转换为原生JS数组才能被正确处理。

解决步骤

1. 调整导入方式

推荐使用命名导入直接引入所需函数,更符合ClojureScript的使用习惯:

(:require ["mathjs" :refer [dot inv]]
          [cljs.core :refer [clj->js]])

若需保留math.js的其他全局功能,可同时保留默认导入:["mathjs" :as math]。

2. 转换数据结构

使用ClojureScript内置的clj->js函数,将ClojureScript向量/矩阵转换为原生JS数组,确保math.js能正确解析输入数据。

修正后的完整代码

(ns numerical-methods.test
  (:require ["mathjs" :refer [dot inv]]
            [cljs.core :refer [clj->js]]))

;; 创建并打印向量
(defn a-vector []
  (let [v [1.0 2.0 3.0]]
    (println "Vector:" v)))

;; 计算并打印两个向量的内积
(defn inner-product-demo []
  (println "Dot product of two vectors")
  (let [v1 [1.0 2.0]
        v2 [3.0 4.0]
        product (dot (clj->js v1) (clj->js v2))]
    (println "Inner Product:" product)))

;; 求矩阵逆并打印
(defn invert-matrix []
  (println "Invert a matrix")
  (let [A [[1 2 3]
           [6 5 4]
           [8 7 9]]
        Ainv (inv (clj->js A))]
    (println "Inverse Matrix:")
    (println Ainv)))

;; 主函数运行示例
(defn -main []
  (println "Chapter 1 demos")
  (a-vector)
  (inner-product-demo)
  (invert-matrix))

;; 执行主函数
(-main)

额外排查点

若仍出现函数未定义问题,可按以下步骤验证:

  • 确认已正确安装math.js:执行npm install mathjs;
  • 检查math.js版本:部分旧版本函数命名有差异(如inv可能需使用inverse),建议安装最新稳定版;
  • 在REPL中直接验证导入:执行(require ["mathjs" :as math])后,用(js/console.log math)查看导出对象的属性,确认函数是否存在。

内容的提问来源于stack exchange,提问作者madeinQuant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:04:50