在core.matrix中矩阵和向量的元素乘法

时间:2014-03-05 12:00:11

标签: matrix clojure

如何在core.matrix中明确地乘以矩阵和向量元素?

我正在尝试找到以下八度代码的core.matrix等价物:

A = [1 2 3 4; 5 6 7 8]
B = [2; 3]
A .* B

ans =
    2    4    6    8
   15   18   21   24

我的猜测是以下代码应该是等效的:

(let [A [[1 2 3 4]  
         [5 6 7 8]] 
      B [[2]        
         [3]]]      
  (* A B))

但它会产生以下错误:

RuntimeException: Incompatible shapes, cannot broadcast [2 1] to [2 4]

2 个答案:

答案 0 :(得分:2)

这里的复杂性是core.matrix对于广播而言比八度音更严格。

特别是,core.matrix中的广播只会创建新的主要尺寸,并且通常不会将长度为1的尺寸扩展为任意长度的尺寸。

编辑:原因是core.matrix实际上是一个必须支持多个底层数组实现的API,所以选择默认广播是可以在大多数合理的底层数组类型上有效实现的东西。 / p>

要解决您的具体问题,您可以考虑:

  • 确保两个矩阵的形状完全匹配
  • 编写模仿八度行为的显式广播函数

答案 1 :(得分:0)

cannot broadcast [2 1] to [2 4]表示无法将2 * 1矩阵转换为2 * 4矩阵。

在代码(* A B)中,*运算符意味着:对于矩阵中的每个元素,找到与另一个矩阵位于相同位置的元素并进行乘法,然后保存结果在一个新的矩阵中。 *运算符并不意味着进行矩阵乘法。