方案中如何实现两个向量的外积?



我想在Scheme中定义一个函数来计算两个向量的外积。

例如:

(outerProduct '(1 2 3) '(4 5))

输出应该是下面的矩阵:

((4 5) (8 10) (12 15))

我怎么才能做到呢?

请注意,示例中使用的集合不是向量,而是列表。但是这段带有两个嵌套的for/list的代码将同时工作:

(define (outer-product v1 v2)
(for/list ((e1 v1))
(for/list ((e2 v2))
(* e1 e2))))

例子:

> (outer-product '(1 2 3) '(4 5))
'((4 5) (8 10) (12 15))
> (outer-product (vector 1 2 3) (vector 4 5))
'((4 5) (8 10) (12 15))

如果你不想使用特定于球拍的结构,你也可以使用map(假设你在代码中使用列表,而不是像主题行这样的向量(也许你在数学意义上考虑向量,而不是方案意义?);虽然球拍也有一个vector-map,所以很容易适应:

(define (outerProduct l1 l2)
(map (lambda (x) (map (lambda (y) (* x y)) l2)) l1))

的例子:

> (outerProduct '(1 2 3) '(4 5))
'((4 5) (8 10) (12 15))

或者使用球拍自带的math/matrix库:

(require math/matrix)
(define (outerProduct l1 l2)
(let ((m1 (->col-matrix l1))
(m2 (->row-matrix l2)))
(matrix->list* (matrix* m1 m2))))

(这是一个更好的选择,如果你直接使用它的矩阵类型,而不是转换到列表和从列表,也做其他的东西与值;此外,文档建议使用类型球拍以获得最佳性能)

(define outerprod
(lambda (a b)
(map (lambda (a)
(map (lambda(b) (* a b))
b))
a )))

1 ]=> (outerprod '(1 2 3) '(4 5))
;Value: ((4 5) (8 10) (12 15))

最新更新