【SICP练习】66 练习2.37
練習2.37
這道題花了我太長的時間了,一開始我就把題目中的m看成了w。然后題中給出的dot-product的兩個參數我還以為一個是向量另一個是矩陣。怎么算都算不出來,直到看到“返回求和...”里的w只有一個i而沒有j。好了,那么開始按照題目的要求來做題了。
既然發現了自己的錯誤,那么就知道了dot-product是干嘛的了,它可以用來求一個矩陣中的一列和一個向量的積。因此定義出matrix-*-vector就不難了。
(define (matrix-*-vector m v)
???(map (lambda (col)
???????????? (dot-product col v))
????????? m))
下面就來用題目中的數據來測試一下。
(matrix-*-vector ‘( (1 2 3 4) (4 5 6 6)(6 7 8 9) ) )
;Value: (30 56 80)
接下來我們來看看transpose,之所以把matrix-*-matrix放在最后是因為其的定義中需要transpose。
(define (transpose mat)
??(accumulate-n cons ‘() mat))
看似這么一行代碼,但其功能可強大了。
(transpose ‘((1 2 3 4) (4 5 6 6) (6 7 89)))
;Value: ((1 4 6) (2 5 7) (3 6 8) (4 69))
如果這里accumulate的變化有什么不明白的,可以回過頭看看練習2.33的解答中的截圖。而accumulate-n只不過是個accumulate的外殼而已,在變換中accumulate-n都將會慢慢變成accumulate。
在線性代數里我們學過,兩個矩陣的乘積mn的第一列第一行的值等于m的第一列和n的第一行的點積,mn的第一列第二行的值等于m的第一列和n的第二行的點積……
(define (matrix-*-matrix m n)
???(let ((cols (transpose n)))
??????(map (lambda (col-of-m)
??????????????? (matrix-*-vector colscol-of-m))
???????????? m)))
版權聲明:本文為 NoMasp柯于旺 原創文章,如需轉載請聯系本人。
轉載于:https://www.cnblogs.com/NoMasp/p/4786153.html
總結
以上是生活随笔為你收集整理的【SICP练习】66 练习2.37的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces Round #29
- 下一篇: BZOJ 3106 棋盘游戏