ryoakg
11/11/2017 - 2:13 PM

commons-math-matrix.clj

(set-env! :dependencies '[;; https://mvnrepository.com/artifact/org.apache.commons/commons-math3
                          [org.apache.commons/commons-math3 "3.6.1"]
                          ])
(import (org.apache.commons.math3.linear EigenDecomposition
                                         MatrixUtils
                                         RealMatrix))

(MatrixUtils/createRealMatrix 2 2)       ;ゼロ行列
(MatrixUtils/createRealIdentityMatrix 2) ;単位行列

(let [m (MatrixUtils/createRealMatrix (into-array [(double-array [1 2 3])
                                                   (double-array [4 5 6])]))]
  [m
   (.transpose m)
   (.scalarMultiply m 10)
   ])

(let [m1 (MatrixUtils/createRealMatrix (into-array [(double-array [1 2])
                                                    (double-array [3 4])]))
      m2 (MatrixUtils/createRealMatrix (into-array [(double-array [10 0])
                                                    (double-array [0 10])]))]
  [(.add m1 m2)
   (.subtract m1 m2)
   (.multiply m1 m2)])

(let [m (MatrixUtils/createRealMatrix (into-array [(double-array [1 2])
                                                   (double-array [3 4])]))]
  [(MatrixUtils/blockInverse m 0)     ;逆行列
   (.multiply m (MatrixUtils/blockInverse m 0)) ;単位行列になるハズ
   ])

;;; 非正則行列に対して逆行列は計算できない
(let [m (MatrixUtils/createRealMatrix (into-array [(double-array [2 1])
                                                   (double-array [2 1])]))]
  (MatrixUtils/blockInverse m 0))

;; 行列式
(let [m  (MatrixUtils/createRealMatrix (into-array [(double-array [1 -2])
                                                    (double-array [3 -4])]))
      ed (EigenDecomposition. m)]
  (.getDeterminant ed))



(let [m  (MatrixUtils/createRealMatrix (into-array [(double-array [1 -2])
                                                    (double-array [3 -4])]))
      ed (EigenDecomposition. m)]
  (->> (.getRealEigenvalues ed)
       (map-indexed (fn [i x]
                      {:固有値       x
                       :固有ベクトル (.getEigenvector ed i)}))))