はこのLINUX

LINUX初心者がロボットをつくろうと頑張るような、そうでもないような

clojure.core.matrixの仕様変更について

Clojure for Machine Learning Clojure for Machine Learning | Packt Publishingを読んでいて、躓いたのでメモ。

P23に行列の乗算を行う部分があるが、本に記載通り

(def A [[1 2 3] [4 5 6]])

(def B [[10 20] [20 30] [30 40]])

(pm (M/* A B))

のように*を用いると、以下のエラーが返されます。

RuntimeException Incompatible shapes, cannot broadcast [3 2] to [2 3] clojure.core.matrix.impl.persistent-vector/eval6174/fn--6175 (persistent_vector.clj:156)

ここで躓きまして、販売元のpacktの該当ページからサンプルコードを持ってこようと開いて見ると、ちゃんと注意書きがありました。

In versions of core.matrix greater than 0.10.0, M/* only performs element-wise multiplication.

In core.matrix 0.3.0, M/* can be used to perform both inner product multiplication as well as element-wise multiplication.

どうやら、clojure.core.matrix.operators/*はバージョン0.10.0以降から仕様が大きく変わってしまったみたいですね。

では、かつてのclojure.core.matrix.operators/*はどこに。。。と探していると、clojure.core.matrix/mmulなるものを発見。

(mmul C D)

-> [[140 200] [320 470]]

期待通りの出力が得られました。✌('ω'✌ )

因みに、現状のclojure.core.matrix.operators/*は

(M/* [[1 2] [3 4]] [[2 2] [2 2]])

-> [[2 4] [6 8]]

のように、行列の同じ場所にある要素同士を乗算する実装になっているようです。