2017-02-12 53 views
0

我正在尝试编写一个函数,该函数需要一个操作和一个矩阵将矩阵转换为向量。例如,如果我打电话给(matrix-to-vector + ((1 2 3 4) (5 6 7 8))),它会返回(6 8 10 12),来自(1+5 2+6 3+7 4+8)。矩阵输入是一个NxM矩阵,操作是一个双参数运算符(如+ - * /或string-append)。它使用运算符将​​矩阵的每一列的元素组合在一起,从而返回大小为M的矢量。我有一种感觉映射在这里会有所帮助,但我不确定如何实现它。我会将操作映射到矩阵列中的每个元素以获得结果向量。函数通过应用给定的操作将矩阵转换为矢量

回答

0

A map将做的伎俩,怀疑。唯一的其他东西要考虑的是,你应该使用apply,因为输入列表的列表:

(define (matrix-to-vector op lst) 
    (apply map op lst)) 

例如:

(matrix-to-vector + '((1 2 3 4) (5 6 7 8))) 
=> '(6 8 10 12) 
+0

所以不适用“应用”映射和操作中的每个列表清单? – kmgauthier

+0

是的,在这种情况下,'apply'使用'map'作为参数操作和所有子列表。如果子列表本身不在列表中,我们可以这样做:'(map +'(1 2 3 4)'(5 6 7 8))''。请记住,'map'接收一个操作和一个或多个列表作为参数,如果传递了多个列表,则操作以元素方式应用于它们。 –

0

人们也可以以更简单的方式,如果一个使用'map'分离构成该矩阵的列表:

(map + '(1 2 3 4) '(5 6 7 8)) 

输出:

'(6 8 10 12) 

它也将有超过2只列出了一个N * M的矩阵工作:

(map + '(1 2 3 4) '(5 6 7 8) '(10 20 30 40)) 

输出:

'(16 28 40 52)