核心矩阵中的矩阵乘法

6

这似乎是一个愚蠢的问题,但是我在寻找一段时间后还是无法弄清楚,所以我在这里问一下。

在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))
1个回答

9
*矩阵运算符是一种逐元素相乘的运算 - 也就是说,它强制两个操作数具有相同的维度,并生成一个新矩阵,其中结果中每个位置的元素是操作数在该位置上的元素的乘积。
我认为你正在寻找clojure.core.matrix中的mmul函数。

确实,你是正确的。谢谢!(mmul (matrix [[1 0 -2] [0 3 -1]]) (matrix [[0 3] [-2 -1] [0 4]])) ==> [[0 -5] [-6 -7]] - Roger Allen
4
考虑的一个选择是跳过将*的矩阵定义放入您的命名空间的步骤,而只是使用emulmmul。这样,在代码中就不会忘记*的含义,也不会疑惑相乘的变量是数字还是矩阵了。如果我不定义希望能够应用于矩阵和数字的函数,则使用重载的算术运算符看起来很酷,但可能会使读者(例如我)感到困惑,并导致错误。这是个人喜好的问题。 - Mars
@Mars 我完全同意,特别是涉及到在clojure.core中定义的函数。那些代码,即使复制到一个新的命名空间中,可能仍然可以编译,但意义完全不同。 - Alex
@Mars 我完全同意。我将使用(:require [clojure.core.matrix :as mat])代替上面的ns。那个ns只是来自github示例。 - Roger Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接