List 用Scheme中的map编写矩阵的点积
主要问题:我们应该如何使用地图它可以处理列表列表吗?换句话说,假设我们有一个列表a=(abc),map可以像(map func abc)一样处理列表a吗List 用Scheme中的map编写矩阵的点积,list,dictionary,matrix,scheme,List,Dictionary,Matrix,Scheme,主要问题:我们应该如何使用地图它可以处理列表列表吗?换句话说,假设我们有一个列表a=(abc),map可以像(map func abc)一样处理列表a吗 下面是对这个问题的详细描述 假设有两个矩阵: (define v (list (list 1 2 3) (list 4 5 6))) (define w (list (list 3 2 1) (list 6 5 4))) 要计算v和w的点积,请使用map: (define (vector-dot .
下面是对这个问题的详细描述 假设有两个矩阵:
(define v
(list (list 1 2 3)
(list 4 5 6)))
(define w
(list (list 3 2 1)
(list 6 5 4)))
要计算v和w的点积,请使用map:
(define (vector-dot . vectors)
(map *
(car vectors)
(cadr vectors)))
(define (matrix-dot v w)
(map vector-dot
v
w))
上面的代码运行良好,但如果我们将函数向量点更改为:
(define (vector-dot . vectors)
(map * vectors))
和(矩阵点v w)将抛出一个错误
问题不在于它为什么会抛出错误,而在于我们应该如何使用映射。它是否可以像将此列表中的所有元素视为参数一样处理列表?您可以使用
apply
,这是对rest参数的补充
(define (vector-dot . vectors)
(apply map * vectors))
(vector-dot '(1 2 3) '(2 2 2) '(10 11 12))
; ==> (20 44 72)
因此,在这个例子中,向量是类似于
((1232)(10112))的列表,而(apply map*)((1232)(10112))
和(apply map*)((1232)(10112))
与(map*”(1232);(10112))相同。
您可以使用apply
,这是对rest参数的补充
(define (vector-dot . vectors)
(apply map * vectors))
(vector-dot '(1 2 3) '(2 2 2) '(10 11 12))
; ==> (20 44 72)
因此,在这个例子中,向量是类似于((1232)(10112))的列表和(apply-map*)((1232)(10212))
和(apply-map*)((1232)(10112))
与(map*)(1232)“10212”)相同。
你熟悉应用吗?