2014-03-05 118 views
3

如何在core.matrix中明智地乘以矩阵和向量元素?在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] 
+0

可能重复?这个问题是否有帮助 - http://stackoverflow.com/questions/19982466/matrix-multiplication-in-core-matrix - 我认为函数mmul应该这样做。 –

回答

2

的复杂性在这里是core.matrix是关于广播比八度有点严格。

特别是,在广播core.matrix只会造成新的主导尺寸,并且通常不会长度1的尺寸扩展到任意长度的尺寸。

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

为了解决您的具体问题,你可能会考虑:

  • 确保两个矩阵精确匹配的形状
  • 写一个明确的广播功能,模仿八音行为
+0

对于clojure新手来说,如果我决定尝试扩展容量core.matrix的广播来覆盖这个用例? core.matrix在其方法中更严格吗?还有一个特别的原因吗? – user3383184

0

cannot broadcast [2 1] to [2 4]表示它无法投射2 * 1矩阵到2 * 4矩阵。

在这里,你的代码(* A B)*操作意味着:对于矩阵中的每个元素,发现与另一矩阵相同位置的元素并做乘法,然后将结果保存在一个新的矩阵。运算符不是要做矩阵乘法。

+0

我不想在这里做矩阵乘法,我想B矩阵被广播为[2 4]矩阵。就好像每行重复4次,如'(mapv(fn [[x]](repeat 4 x))B)' – user3383184