是否可以通过仅使用“map”和“apply”来进行向量矩阵乘法?

时间:2017-02-01 17:45:03

标签: scheme

我被要求实现矩阵乘法。到目前为止,我的代码是:(define mult (λ (m1 m2) (if (or (empty? m1) (empty? m2)) '() (map vec-mult m1 m2))))

仅生成列表列表。必须将每个内部列表相加以给出沿对角线的值以添加以生成元素。我停留在如何进行2D乘法的部分,以便m1中的每一行乘以m2中的每一行(因此矢量 - 矩阵乘法)。我也实现了“transpose”和“vec-mult”。请给我一个关于如何解决这个问题的提示。教授希望我们使用转置和地图但我不知道如何完成它。

由于

2 个答案:

答案 0 :(得分:0)

使用列表的每个元素对绑定变量执行某些操作:

(let ((a 5))
  (map (lambda (e) (* a e)) '(1 2 3 4)))
; ==> (5 10 15 20) 

以列表作为参数求和(或做任何事情):

(apply + '(1 2 3)) 
; ==> 6

unzip一个清单:

(apply map list '((1 2 3) (4 5 6) (7 8 9) (10 11 12)))
; ==> ((1 4 7 10) (2 5 8 11) (3 6 9 12))

展平一个级别:

(apply append '((1 (2)) (3 4)))
; ==> (1 (2) 3 4)

答案 1 :(得分:0)

让我们考虑两个矩阵:

    [ a b ]            [ x ]
A = [ c d ]        v = [ y ]

首先,A和B的矩阵产品是:

      [ ax + by ]
Ax =  [ cx + dy ]

请注意,转置B给出:

 T   
v  = [ x y ]

现在考虑矩阵A的行与v:

的转置的元素乘法
[a b] mult [x y]    [ ax by ]

[c d] mult [x y]  = [ cx dy ]

请注意,行的总和为:

ax + by 
cx + dy

是Ax的元素。

所以要将A乘以v:

  1. 转置v
  2. 对于A的所有行,使用v转置计算逐点乘积。
  3. 收集行的总和。
  4. 广告1:转置:Transpose a matrix in racket (list of lists

    广告2.使用(map * row v-transposed)计算逐点产品。

    广告3.使用(apply + products)计算产品总和。