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