5
这似乎是一个愚蠢的问题,但是我在查看一下后无法弄清楚,所以我会在这里问。core.matrix中的矩阵乘法
如何在core.matrix中将3x2矩阵乘以2x3矩阵?我必须误解一些非常基本的东西。天真地说,我期望这个工作,我认为core.matrix会为我做潜在的数学。
(* (matrix [[1 0 -2]
[0 3 -1]])
(matrix [[0 3]
[-2 -1]
[0 4]]))
我通过先打发现谷歌搜索http://www.purplemath.com/modules/mtrxmult.htm这个例子和预期的结果是
[[ 0 -5]
[-6 -7]]
相反,我得到:提前
RuntimeException Incompatible shapes, cannot broadcast [3 2] to [2 3]
clojure.core.matrix.impl.persistent-vector/eval5013/fn--5014
(persistent_vector.clj:152)
感谢。
p.s.我的名字空间看起来就像从core.matrix的例子
(ns xyz
(:refer-clojure :exclude [* - + == /]) ; get from core.matrix
(:use clojure.core.matrix)
(:use clojure.core.matrix.operators)
(:gen-class))
确实你是对的。谢谢! (mmul(矩阵[[1 0 -2] [0 3 -1]])(矩阵[[0 3] [-2 -1] [0 4]])) == [[0-5 ] [-6 -7]] –
要考虑的一个选择是跳过将'*'的矩阵定义拉入命名空间的步骤,并且只需使用'emul'和'mmul'。那样的话,就没有机会忘记代码中的“*”意味着什么,或者想知道变量是否乘以保持数或矩阵。我觉得如果我没有定义我想能够应用于矩阵和数字的函数,那么使用重载算术运算符看起来很酷,但可能会使读者(比如我)感到困惑并导致错误。不过,这是个人喜好的问题。 – Mars
@Mars我同意100%,特别是当涉及clojure.core中定义的函数时。该代码在复制到新的名称空间时可能仍会编译,但意味着完全不同的东西。 – Alex