6

给定矩阵的大小和位置 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。谁能帮我?

4

3 回答 3

10

我喜欢 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

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

于 2012-10-13T20:00:20.113 回答
5

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

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

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的?

于 2012-10-12T14:45:50.993 回答
3

分解它。

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

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

  2. 编写一个与(a -> b) -> [[a]] -> [[b]]类似的类型的函数map。(线索:定义特征map。两次。)

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

于 2012-10-12T14:17:01.850 回答