【问题标题】:How to form a matrix list of list using OCaml List Modules only?如何仅使用 OCaml 列表模块形成列表的矩阵列表?
【发布时间】:2016-04-19 00:51:31
【问题描述】:

我想知道如何使用 O'Caml 形成矩阵

我已经从一个元组列表中形成了一个普通列表,这些元组通过以下方式指示索引和元素:

  List.map (fun (idx, x) -> x ) list

我想在不使用递归或循环的情况下对矩阵执行此操作。只是高阶函数和 List.module

(上下文:我正在尝试在给定矩阵的情况下转置矩阵)

【问题讨论】:

  • 你的函数似乎没有按照你说的做。它忽略元素并列出索引。目前尚不清楚您对矩阵的要求是什么。你是说你会有一个三元组列表(index1,index2,element)?您是否保证索引将从 0(比如说)开始并且会很密集?它们会按顺序排列吗?
  • @JeffreyScofield 我刚刚修复它,这是一个错字。我的错。是的,我正在尝试获取三元组列表(index1、index2、element)。我尝试转置矩阵的方法是 1. 在每个元素上附加一个标志左右作为表示它的索引的数字(通过 mapi?) 2. 将矩阵折叠成一个大的元组列表,提供位置信息(通过 flatten) 3. 遍历元组列表并使用 @ 组装一个矩阵来重构矩阵

标签: list matrix ocaml transpose higher-order-functions


【解决方案1】:

我认为你的方法会奏效,尽管它可能不是最快的方法。

没有简单的函数可以从一组索引和元素构造一个列表(或列表的列表)。由于索引可能具有所有值(重复、缺失值、乱序等),因此很难对这样的函数进行简洁明了的定义。

我想说缺少的步骤是将三元组列表排序为所需的顺序。由于 List 模块中有一个排序功能,这可能是您的限制允许的。

本质上,原始顺序按第一个索引排序,然后是第二个索引。因此,要获得要按第二个索引然后第一个索引排序的转置。

确定正确的顺序后,您可以使用 List.fold_left 或 List.fold_right 组装最终的列表列表。

这是一个使用 List.fold_left 将列表重新格式化为三组的函数。这不是您想要的功能,但可能很接近:

let bythrees l =
    let iby (cur, prev, n) x =
        if n mod 3 = 2 then ([], (x :: cur) :: prev, n + 1)
        else (x :: cur, prev, n + 1)
    in
    let (_, res, _) = List.fold_left iby ([], [], 0) l in
    res

运行它时的外观如下:

# bythrees [1;2;3;4;5;6;7;8;9];;
- : int list list = [[9; 8; 7]; [6; 5; 4]; [3; 2; 1]]

输出仍然需要一些工作,但这表明您可以通过这种方式制作列表列表。

【讨论】:

    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 2017-05-03
    • 2015-10-17
    • 2017-05-09
    • 1970-01-01
    • 2017-09-11
    • 2020-06-06
    • 2011-12-21
    相关资源
    最近更新 更多