【问题标题】:element wise multiplication of a matrix and a vector in core.matrixcore.matrix 中矩阵和向量的元素乘法
【发布时间】:2014-03-05 12:00:11
【问题描述】:

如何在 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]

【问题讨论】:

标签: matrix clojure


【解决方案1】:

这里的复杂性在于core.matrix 对广播比八度更严格一些。

特别是core.matrix 中的广播只会创建新的前导维度,通常不会将长度为 1 的维度扩展到任意长度的维度。

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

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

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

【讨论】:

  • 如果我决定尝试扩展 core.matrix 的广播能力以涵盖此用例,对于 clojure 新手来说会有多痛苦? core.matrix 的方法更严格,还有什么特别的原因吗?
【解决方案2】:

cannot broadcast [2 1] to [2 4] 表示它不能将 2*1 矩阵转换为 2*4 矩阵。

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

【讨论】:

  • 我不想在这里进行矩阵乘法,我希望将 B 矩阵作为 [2 4] 矩阵进行广播。好像每一行都重复了 4 次比如(mapv (fn [[x]] (repeat 4 x)) B)
猜你喜欢
  • 2011-12-13
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多