1

我正在尝试将两个矩阵相乘。

我正在使用取自这篇文章的转置:帮我解释 F# 矩阵转置函数

let rec transpose = function
| (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
| _ -> []

我还使用了 innerMult ,它将两个列表的每个元素相乘,然后将它们相加。

let rec innerMult u v =
match u, v with 
| [x], [y] -> x*y     | u'::u, v'::v -> u'*v' + inner u v 

所以使用这两个函数我会尝试将行乘以列。当然,我假设两个矩阵都满足乘法发生的条件。也就是说,行必须等于列。

矩阵乘法代码:

let multiply (xs, ys) = 
let tl = transpose ys in 
    let rec mMult xs = 
    match xs, tl with
    | x::xs, t::tl -> inner x t
  mMult xs;;

测试:相乘 ([[1;2;3];[4;5;6]], [[0;1];[3;2];[1;2]]);; 输出:> val it:int = 9

目前它缺少递归或 List.map ,因此它实际上进行了矩阵乘法。我只是不知道如何解决这个问题。

4

1 回答 1

4

看起来这应该有效:

let multiply xs ys =
    [for row in xs ->
         [for col in transpose ys -> inner row col]]
于 2013-06-06T17:15:24.580 回答