2013-11-14 99 views
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)) 

回答

9

*矩阵运算符是逐元素乘法 - 也就是说,它迫使两个操作数以相同的尺寸,并产生一个新的矩阵,其中的元素在结果中的每个位置都是操作数中该位置元素的乘积。

我认为您正在寻找clojure.core.matrixmmul功能。

+0

确实你是对的。谢谢! (mmul(矩阵[[1 0 -2] [0 3 -1]])(矩阵[[0 3] [-2 -1] [0 4]])) == [[0-5 ] [-6 -7]] –

+4

要考虑的一个选择是跳过将'*'的矩阵定义拉入命名空间的步骤,并且只需使用'emul'和'mmul'。那样的话,就没有机会忘记代码中的“*”意味着什么,或者想知道变量是否乘以保持数或矩阵。我觉得如果我没有定义我想能够应用于矩阵和数字的函数,那么使用重载算术运算符看起来很酷,但可能会使读者(比如我)感到困惑并导致错误。不过,这是个人喜好的问题。 – Mars

+0

@Mars我同意100%,特别是当涉及clojure.core中定义的函数时。该代码在复制到新的名称空间时可能仍会编译,但意味着完全不同的东西。 – Alex