【问题标题】:Haskell - How to create a matrixHaskell - 如何创建矩阵
【发布时间】:2012-10-03 08:54:38
【问题描述】:

给定矩阵的大小和位置 p。如何用 p 中的 1 和其他位置的 0 填充矩阵?

Ex.: size=(3,3) p=(3,1)

[0 0 0]
[0 0 0]
[1 0 0]

我定义了:

type Matrix= [[Int]]
type Pos = (Int,Int)

f:: Pos->Pos->Matrix

f 的返回例如是:

 [[0,0,0],[0,0,0],[1,0,0]]

我在开始时遇到了麻烦,即不知道如何实现函数f。谁能帮帮我?

【问题讨论】:

    标签: list haskell matrix


    【解决方案1】:

    我喜欢 AndrewC 的回答,但我会一口气完成,嵌套列表推导并仅测试位置的相等性,而不是单独的行和列。

    f :: Pos -> Pos -> Matrix
    f (h, w) p =  [ [if (y, x) == p then 1 else 0 | x <- [1..w]]
                  | y <- [1..h]]
    

    我选择了我的对齐方式,以便x 水平延伸,y 垂直延伸,其核心是根据坐标定义典型元素的表达式。如果行不同,则不会对列进行比较。我想人们可以使用replicate w 0 稍微更有效地计算全零行,但要以清晰为代价。

    我也会考虑写作

    g :: Pos -> Pos -> Matrix
    g (h, w) (y, x)  =   replicate (y-1) wzeros
                     ++  (replicate (x-1) 0 ++ 1 : replicate (w-x) 0)
                     :   replicate (h-y) wzeros
      where wzeros = replicate w 0
    

    更长,但在空间上更直接。它保留了更多的共享,并且可能减少了一些减法。但是如果位置超出相关范围,它的行为就有点奇怪了。

    【讨论】:

    • 我自己也会嵌套理解,但由于 May 正在做一系列 Haskell 作业,我选择了几个概念性的垫脚石并留下了一些空白。也许current question 也有一个巧妙的解决方案。
    【解决方案2】:

    你可以通过两个列表推导来做到这一点,一个在彼此内部使用:

    将问题分解为两个较小但相似的问题:

    row b lengthacross = 
       [ --some expression that's 1 if x == b and zero otherwise
             | x <- [1..lengthacross]]
    

    row 会有什么类型?

    matrix (a,b) (lendown,lenacross) = 
       [ --a row with a 1 in it or just zeros as appropriate 
            | y <- --an appropriate list
              ]
    

    matrix 会有什么类型?

    【讨论】:

      【解决方案3】:

      分解它。

      1. 编写一个Pos -&gt; [[Pos]] 类型的函数,它接受一个大小,并给出一个该大小的“矩阵”,但每个元素都有自己的位置。

        例如ofSize (2,2) = [[(1,1), (1,2)], [(2,1), (2,2)]]

      2. 编写一个(a -&gt; b) -&gt; [[a]] -&gt; [[b]] 类型的函数,其工作方式类似于map。 (提示:定义特征map。两次。)

      然后,您可以将这些部分组合成一个函数,该函数首先生成一个位置“矩阵”,然后将其映射到所需的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        • 2019-09-29
        • 2017-05-09
        • 1970-01-01
        相关资源
        最近更新 更多