【问题标题】:Returning a matrix in diagonals in Haskell在Haskell中返回对角线矩阵
【发布时间】:2016-05-29 15:51:53
【问题描述】:

所以我被要求在 haskell 中为我的每周作业编写一个函数 diag :: [[a]] -> [a],它返回一个格式良好的矩阵的所有对角线,例如:

生成列表:[a11,a12,a21,a13,a22,a31,a14,a23,a32,a24,a33,a34]

由于我们不允许使用任何第三方包,例如 Data.matrix,而且我无法完全理解 this post 中的实现,我希望您能对此提供帮助。

编辑:

我理解this one,但它只返回一个错误顺序的对角线。我也理解math,但它也没有真正帮助我。

【问题讨论】:

  • 如果行是(x:xs)diagonals (x:xs)diagonals xs有什么关系?
  • 如果您说您了解/不了解哪些部分,我很乐意在链接的答案中详细解释我的实现。
  • @DanielWagner 这部分让我很困惑:go b es_ = [h | h:_ <- b] : case es_ of [] -> transpose ts e:es -> go (e:ts) es where ts = [t | _:t <- b]。我是 FP 的新手,我知道有一个名为 go 的函数,带有参数 bes_。但是case 和这个“模式匹配”到底是什么(在我看来就是这样)。
  • @ErikR 我不太确定你想指出什么......
  • @GabbaGandalf case es_ of [] -> branch1; e:es -> branch2 检查es_ 是否为空列表,在这种情况下它的值为branch1,或者它是否为非空,在这种情况下它命名第一个元素e ,列表的其余部分es,然后变为值branch2。如果您熟悉用这些术语思考递归函数,请考虑“基本案例”与“递归案例”。在这个特定的case 中,es_ 会跟踪我们在遍历中还没有开始遍历的行,因此它将采用第一个分支,直到到达最长的对角线。

标签: haskell matrix diagonal


【解决方案1】:

注意当您填充每一行以使左箭头指向正下方时会发生什么:

a11 a12 a13 a14
    a21 a22 a23 a24
        a31 a32 a33 a_34

如果您可以以某种方式将列“堆叠”在一起,您将获得所需的结果。但不幸的是,我们不能堆叠列。当然,如果我们对矩阵进行转置,那么列就是行,它们可以用concat连接在一起,这和堆叠列的效果是一样的。但是我们在进行转置时需要保留填充。

这是一个想法。如果我们将所有值包装在 Just 中并在填充点插入 Nothing 会怎样?

(Just a11) (Just a12) (Just a13) (Just a14) Nothing    Nothing
Nothing    (Just a21) (Just a22) (Just a23) (Just a24) Nothing
Nothing    Nothing    (Just a31) (Just a32) (Just a33) (Just a34)

现在,当我们转置时,将保留移位。只需将所有Nothings、concat 行删除到一个列表中,然后解开每个Just

当然,这是家庭作业,您必须自己编写代码。但我希望这至少能让您对如何解决问题有一个很好的了解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多