2014-03-05 167 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