2017-02-01 58 views
0

我被要求實現矩陣乘法。到目前爲止,我擁有的代碼爲:(define mult (λ (m1 m2) (if (or (empty? m1) (empty? m2)) '() (map vec-mult m1 m2))))是否可以通過使用「map」和「apply」來完成向量 - 矩陣乘法?

只生成列表的列表。每個內部列表必須加總,以便爲我生成元素時沿對角線添加的值。我被困在如何做2D乘法的部分,以便m1中的每一行乘以m2中的每一行(因此是矢量 - 矩陣乘法)。我也有「轉置」和「vec-mult」的實施。請給我一個關於如何解決這個問題的提示。教授希望我們使用轉置和地圖,但我不明白它是如何完成的。

感謝

回答

0

做一些與列表中的每個元素綁定變量:

(let ((a 5)) 
    (map (lambda (e) (* a e)) '(1 2 3 4))) 
; ==> (5 10 15 20) 

總和(或做任何事情)用列表作爲參數:

(apply + '(1 2 3)) 
; ==> 6 

unzip清單:

(apply map list '((1 2 3) (4 5 6) (7 8 9) (10 11 12))) 
; ==> ((1 4 7 10) (2 5 8 11) (3 6 9 12)) 

平鋪一層:

(apply append '((1 (2)) (3 4))) 
; ==> (1 (2) 3 4) 
0

讓我們考慮兩個矩陣:

[ a b ]   [ x ] 
A = [ c d ]  v = [ y ] 

首先A和B的所有矩陣產品是:

 [ ax + by ] 
Ax = [ cx + dy ] 

注意變調B給出:

T 
v = [ x y ] 

現在考慮矩陣A與轉置V的行的elementwise乘法:

[a b] mult [x y] [ ax by ] 

[c d] mult [x y] = [ cx dy ] 

注意,行中的數量是:

ax + by 
cx + dy 

其是Ax的元件。

所以要乘以用v:

  1. 移調v
  2. 一個計算的逐點乘積的v調換的所有行。
  3. 收集行的總和。

廣告1:換位:Transpose a matrix in racket (list of lists

廣告2.使用(map * row v-transposed)計算逐點乘積。

廣告3.使用(apply + products)來計算產品的總和。