核心矩阵中矩阵和向量的逐元素乘法

4

如何在core.matrix中对矩阵和向量进行逐元素相乘?

我正在尝试寻找以下Octave代码的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]

可能是重复的问题?这个问题是否有帮助- https://dev59.com/a3nZa4cB1Zd3GeqPmSS6 - 我认为函数mmul应该可以解决它。 - Daniel Neal
2个回答

2
这里的复杂性在于core.matrix对广播的限制比Octave更严格。
特别是,在core.matrix中广播只会创建新的前导维度,通常不会将长度为1的维度扩展到任意长度的维度。
编辑:原因是core.matrix实际上是一个API,必须支持多个底层数组实现,因此选择默认广播以便在大多数可行的底层数组类型上实现高效。
要解决您的具体问题,您可以考虑:
  • 确保两个矩阵的形状完全匹配
  • 编写一个明确的广播函数,模仿Octave的行为

如果我决定尝试扩展core.matrix的广播能力以涵盖这种用例,对于一个Clojure新手来说会有多痛苦?此外,core.matrix在其方法上更加严格的原因是什么? - user3383184

0

无法将 [2 1] 广播到 [2 4] 表示无法将 2*1 矩阵转换为 2*4 矩阵。

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


我这里不是在尝试进行矩阵乘法,我希望将B矩阵广播为一个[2 4]的矩阵。就好像每一行都被重复了4次,例如(mapv (fn [[x]] (repeat 4 x)) B) - user3383184

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