mag*_*agu 6 scheme matrix racket
stackoverflow 的新手和球拍的新手。我一直在使用本文档研究球拍:https : //docs.racket-lang.org/reference/pairs.html
这是我对地图的理解:
(map (lambda (number) (+ 1 number))'(1 2 3 4))
这分配'(1 2 3 4)给变量number,然后 map 执行(+ 1 '(1 2 3 4))。
但是当我看到以下内容时:
(define (matrix_addition matrix_a matrix_b)
  (map (lambda (x y) (map + x y)) matrix_a matrix_b))
我很迷茫。我假设我们正在分配两个变量xand y,然后执行(map + x y),但我不明白什么或如何(map + x y)工作。
我遇到的另一个问题是
(define (matrix_transpose matrix_a)
  (apply map (lambda x x) matrix_a))
究竟(lambda x x)是做什么的?
非常感谢您的澄清。如您所见,我一直在按照我朋友的建议进行矩阵运算。
这是一种思考方式map:
(map f (list 1 2 3)) 
; computes 
(list (f 1) (f 2) (f 3))
和
(map f (list 1 2 3) (list 11 22 33)) 
; computes 
(list (f 1 11) (f 2 22) (f 3 33))
所以你的例子就+变成了:
(map + (list 1 2 3) (list 11 22 33)) 
; computes 
(list (+ 1 11) (+ 2 22) (+ 3 33))
这是(list 12 24 36).
一开始写得更清楚
(define f (lambda (x y) (+ x y)))
(map f (list 1 2 3) (list 11 22 33)))
但当你习惯了mapandlambda的简写
(map (lambda (x y) (+ x y)) (list 1 2 3) (list 11 22 33)))
很有用。
这分配
'(1 2 3 4)给变量number,然后map执行(+ 1 '(1 2 3 4))。
不,它不是这么做的。map是一个循环函数,它为列表中的每个元素单独调用该函数,并返回结果列表。
所以首先它绑定number并1执行(+ 1 number),即(+ 1 1)。然后它绑定number并2执行(+ 1 number),即(+ 1 2)。等等。所有结果都收集到一个列表中,因此返回(2 3 4 5)。
开始进行矩阵运算,矩阵表示为列表的列表,因此我们需要嵌套循环,这是通过对map.
(map (lambda (x y) (map + x y)) matrix_a matrix_b)
外部的map工作原理如下:首先,它将x和分别绑定到和y的第一个元素,并执行。然后它将和绑定到和的第二个元素,并执行。对于两个列表的每个元素依此类推。最后它返回所有这些结果的列表。matrix_amatrix_b(map + x y)xymatrix_amatrix_b(map + x y)
内部(map + x y)将两个列表的相应元素相加,返回总和列表。例如(map + '(1 2 3) '(4 5 6))返回(5 7 9)。
因此,这总共创建了一个列表列表,其中每个元素都是matrix_a和的相应元素的总和matrix_b。
最后,
到底是
(lambda x x)做什么的?
它绑定x到所有参数的列表,并返回该列表。所以((lambda x x) 1 2 3 4)返回列表(1 2 3 4)。它基本上是 的逆过程apply,它将列表扩展到函数的多个参数中。
(apply (lambda x x) some-list)
返回 的副本some-list。
| 归档时间: | 
 | 
| 查看次数: | 84 次 | 
| 最近记录: |