【问题标题】:F# Matrix MultiplicationF# 矩阵乘法
【发布时间】:2013-06-02 18:52:12
【问题描述】:

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

我正在使用取自这篇文章的转置:Help me to explain the F# Matrix transpose function

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]]);;输出:> 验证它:int = 9

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

【问题讨论】:

  • 如果您做任何需要良好性能的事情,您可能想要使用 math.net。然而,这有一个入门成本。技术计算有它的小规则..

标签: f# matrix-multiplication


【解决方案1】:

看来这应该可行:

let multiply xs ys =
    [for row in xs ->
         [for col in transpose ys -> inner row col]]

【讨论】:

  • 可以不使用 for 循环吗?
  • 嗯,我认为 for 循环最清楚,但如果您愿意,您可以随时将 [for variable in someList -> body] 替换为 someList |> List.map (fun variable -> body)
  • 这样的? xs |> List.map (转置 ys -> (inner xs ys))
  • 不,您需要替换两个列表推导:let multiply xs ys = xs |> List.map (fun row -> transpose ys |> List.map (fun col -> inner row col))
  • |> 不是绝对必要的,但在某些情况下可以帮助进行类型推断。 x |> ff x 的结果相同,所以你可以写let multiply xs ys = List.map (fun row -> List.map (fun col -> inner row col) (transpose ys)) xs
猜你喜欢
  • 2018-04-11
  • 2017-03-11
  • 2013-12-23
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多