在此示例中,`map` 如何表现出矩阵乘法失败?
How does `map` behave that matrix multiplication fails in this example?
我正在尝试制作一个在方案中进行矩阵向量乘法的函数。我对结果感到困惑。这是我的代码,它定义了一个函数来计算两个向量的点积:
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))
(define (dot-product v w)
(accumulate + 0 (map * v w)))
这 return 是向量的预期点积,例如 (list 2 3 4)
和 (list 1 1 1)
。但是当我尝试用
计算矩阵和向量的乘积时
(define (matrix-*-vector m v)
(map (lambda (x) dot-product v x) m))
此函数将简单地 return 原始矩阵 m
,而不是预期的结果。我特别困惑,因为我可以用 Wolfram 语言很好地编写它并且它的行为符合预期:
myMatrixMult[m_,v_]:=Map[Function[x,Dot[v, x]], m]
(我不认为你需要精通任何一种语言才能看到相似之处)。
我对方案实施有什么误解?使用 map
和 dot-product
定义矩阵向量乘法需要做什么?
您的 lambda
中缺少括号:
(lambda (x) dot-product v x)
从不调用 dot-product
,它只是 returns x
。
你需要
(lambda (x) (dot-product v x))
我正在尝试制作一个在方案中进行矩阵向量乘法的函数。我对结果感到困惑。这是我的代码,它定义了一个函数来计算两个向量的点积:
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))
(define (dot-product v w)
(accumulate + 0 (map * v w)))
这 return 是向量的预期点积,例如 (list 2 3 4)
和 (list 1 1 1)
。但是当我尝试用
(define (matrix-*-vector m v)
(map (lambda (x) dot-product v x) m))
此函数将简单地 return 原始矩阵 m
,而不是预期的结果。我特别困惑,因为我可以用 Wolfram 语言很好地编写它并且它的行为符合预期:
myMatrixMult[m_,v_]:=Map[Function[x,Dot[v, x]], m]
(我不认为你需要精通任何一种语言才能看到相似之处)。
我对方案实施有什么误解?使用 map
和 dot-product
定义矩阵向量乘法需要做什么?
您的 lambda
中缺少括号:
(lambda (x) dot-product v x)
从不调用 dot-product
,它只是 returns x
。
你需要
(lambda (x) (dot-product v x))