可以使用clojure中提供的interop函数将apache-commons-matrix和core.matrix进行转换,使其能够兼容。具体实现方法如下所示:
(ns myproject.core
(:require [clojure.core.matrix :as matrix]
[clojure.java.jniloader :as jni]
[org.apache.commons.math3.linear :as apache-matrix]))
; 加载本地库
(jni/load "liblapack.so")
; 定义一个将apache-matrix转换为core.matrix格式的函数
(defn apache->core-matrix [m]
(matrix/matrix
(vec (map #(vec %) (.getData m)))
(map keyword (.getRowNames m))
(map keyword (.getColumnNames m))))
; 定义一个将core.matrix转换为apache-matrix格式的函数
(defn core->apache-matrix [m]
(let [rows (matrix/dimension m 0)
cols (matrix/dimension m 1)]
(doto (new apache-matrix/Array2DRowRealMatrix rows cols)
(.setSubMatrix (map vec (matrix/rows m)) 0 0)
(.setRowNames (map name (matrix/row-names m)))
(.setColumnNames (map name (matrix/column-names m))))))
; 定义一个使用apache-commons-matrix的函数
(defn apache-matrix-func []
(let [m (new apache-matrix/Array2DRowRealMatrix [[1.0 2.0] [3.0 4.0]])]
(.multiply m m)))
; 定义一个使用core.matrix的函数
(defn core-matrix-func []
(let [a (matrix/matrix [[1.0 2.0] [3.0 4.0]])
b (matrix/matrix [[5.0] [6.0]])]
(matrix/* a b)))
; 调用apache-commons-matrix的函数
(apache-matrix-func) ; [7.0 10.0][15.0 22.0]
; 调用core.matrix的