【问题标题】:Turn a list into a matrix将列表变成矩阵
【发布时间】:2011-12-21 09:59:02
【问题描述】:

我整个下午都在做一件简单的事情,但由于某种原因似乎无法正确完成:如何将列表转换为给定宽度的矩阵。

示例: 我有一个列表,例如

[1, 3, 5, 7, 6, 8, 9, 0]

并想创建一个矩阵如

[[1, 3],
 [5, 7],
 [6, 8],
 [9, 0]]

通过谓词

list2matrix/3 : list2matrix(List, Size_of_Rows, Matrix).

在本例中使用如下:

list2matrix([1, 3, 5, 7, 6, 8, 9, 0], 2, Matrix).

如果列表的长度不是行大小的倍数,则谓词应该失败。

我决定不发布我的作品,因为我认为我写错了,这无助于我对其进行更正;(

如果您能提出有关如何处理此类问题的任何线索,请提前致谢。

【问题讨论】:

  • 您的问题陈述不完整。 list2matrix([1, 3, 5], 2, Matrix) 是成功还是失败?如果成功,应将[5] 删除或扩展为[5,_] 或其他任何值。
  • 假设它会失败,感谢您指出这一点。因为我打算在正方形长度的列表上使用它,所以我不精确;(

标签: prolog


【解决方案1】:

顺便说一句,我想我会提到我最后写的代码:

length_(Length, List) :- length(List, Length).

list2matrix(List, RowSize, Matrix) :-
    length(List, L),
    HowManyRows is L div RowSize,
    length(Matrix, HowManyRows),
    maplist(length_(RowSize), Matrix),
    append(Matrix, List).

我猜它更面向高级且阅读更有趣:)

【讨论】:

  • 有趣!使用library(lambda),您可以编写maplist({RowSize}+\Xs^length(Xs,RowSize), Matrix),而不是使用辅助定义。见this intro
【解决方案2】:

您可以将问题分为两部分。 第一个构建块是构建一行 N 个元素。也就是说,将输入列表拆分为两个列表,一个将恰好有 N 个元素(行),另一个是输入列表的剩余部分。

第二个构建块是构建由行组成的矩阵。

list_to_matrix([], _, []).
list_to_matrix(List, Size, [Row|Matrix]):-
  list_to_matrix_row(List, Size, Row, Tail),
  list_to_matrix(Tail, Size, Matrix).

list_to_matrix_row(Tail, 0, [], Tail).
list_to_matrix_row([Item|List], Size, [Item|Row], Tail):-
  NSize is Size-1,
  list_to_matrix_row(List, NSize, Row, Tail).

【讨论】:

  • 非常感谢您的回答,我正在努力理解它并会尽快对其进行测试,之后我会发表评论:)
  • 好吧,我读了它并且很容易理解它,尽管我仍然认为我自己很难找到解决方案:(我刚刚添加了:- !. 以减少回溯之后每个第一选择都是确定性的,现在我有了我想要的,非常感谢:)
  • 你的list_to_matrix_row可以简化为list_to_matrix_row(L, RowLen, Row, Rest) :- length(Row, RowLen), append(Row, Rest, L).
  • 你是对的!但是我相信使用这个递归过程更容易理解。
【解决方案3】:

在您想要的结果中寻找一种模式。 这意味着配对号码将被分配为每对中的第二个号码,非配对将每次排在第一位。 创建一个二维数组并将非对位置分配给子索引“a” 并与“b”配对。

正如你所见,“i”是一个数组的索引,一个多维数组。 我[a][b]

您需要遍历这两个数组才能完成此操作。

希望对你有帮助。

【讨论】:

  • 这样做时我遇到的问题是 2 作为矩阵的宽度是可以的,但对于任何数字而不是 2 都可以。在我的情况下,我对转换列表特别感兴趣长度为 81 的 9*9 矩阵。我希望得到的谓词是大小硬编码免费的,但如果 9 必须硬编码,那么没关系!
猜你喜欢
  • 1970-01-01
  • 2017-05-03
  • 2017-05-09
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多