【问题标题】:Comparing Bool Value in Matrix比较矩阵中的布尔值
【发布时间】:2010-10-31 14:47:24
【问题描述】:
t = True
f = False
anzNachbarn :: [[Bool]] -> (Integer,Integer) -> Integer
anzNachbarn a (x,y)
       | x < 0 || y < 0=-1
       | otherwise ... here comes the comparison

这是一个示例矩阵:

[[True,False,False],
 [True,False,False],
 [False,True,False]]

这里我需要一个算法,它计算(对于矩阵中给定的 x 和 y 位置)它的邻居(只有“真正的”邻居)并为每个真正的邻居增加 1。

例如:anzNachbarn [[True,False,False],[True,False,False],[False,True,False]] (0,1)

返回 2。

:编辑

我还有一个问题,我现在如何实现结果矩阵的每个组件,具有 True 相邻字段的命名元素的数量表示参数矩阵的相应组件适用于

[[真,假,假],

[真,假,假],

[假,真,假]]

函数func返回结果矩阵[[1,2,0], [2,3,1], [2,1,1]] 带有签名 func :: [[Bool]] -> [[Integer]] 你对此有什么想法吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    在这种情况下,您几乎肯定希望使用数组(来自Data.Array),因为通过索引在列表中查找项目非常慢。

    这是使用Array 的快速实现:

    countNeighbors :: Array (Int, Int) Bool -> (Int, Int) -> Int
    countNeighbors board (x, y) = length
      [ (x', y')
      | x' <- [x - 1, x, x + 1]
      , y' <- [y - 1, y, y + 1]
      , x' /= x || y' /= y
      , inRange (bounds board) (x', y')
      , board ! (x', y')
      ]
    

    这是一个包含两个生成器和三个守卫的列表推导式。生成器只是为我们提供了以(x, y) 为中心的 3×3 正方形中九个位置的索引(如果您不希望考虑拐角处的邻居,则需要稍作更改)。

    第一个守卫 (x' /= y') 忽略 (x, y) 本身。第二个抛出不在数组范围内的位置。最后的守卫会抛出数组中具有False 值的位置。

    所以我们现在有一个具有True 值的邻居的索引列表。此列表的长度是所需的计数。

    【讨论】:

    • 守卫x' /= y' 删除沿对角线的所有值,而不是忽略给定值。我想你的意思是x' /= x || y' /= y
    • @Paul:你当然是对的。我输入得太快了,但现在已经修好了。
    【解决方案2】:

    这很难看,但似乎有效......

    anzNachbarn :: [[Bool]] -> (Int,Int) →  Integer
    anzNachbarn a (x,y)
       | x < 0 || y < 0 = -1
       | otherwise = sum [v x' y' | x' <- [max 0 (x-1)..x+1], 
                                    y' <- [max 0 (y-1)..y+1], 
                                    x ≠ x' || y ≠ y' ]
         where v i j = if j >= length a 
                          || i >= length (a !! 0) 
                          || not (a !! j !! i) 
                       then 0 else 1
    

    [编辑]

    为了转换整个数组,你可以写同样丑的

    conv a = [line y | y <- [0 .. (length a) - 1]]
        where line y = [anzNachbarn a (x,y) | x <- [0 .. ((length (a !! 0) - 1)]]
    

    请注意,这样做的性能很糟糕。

    【讨论】:

    • 如何将索引 (Int,Int) 更改为 (Integer,Integer) 程序运行为真
    • 我还有一个问题我现在如何实现结果矩阵的每个组件,命名为True的相邻字段的数量表示参数矩阵的相应组件适用于[[True, False, False], [True, False, False], [False, True, False]],函数变换结果矩阵 [[1,2,0], [2,3,1], [2,1,1] ] 带签名 func :: [[Bool]] -> [[Integer]]
    • 整数的问题是,那!!需要一个 Int。所以如果你写 a !! (fromIntegral j) !! (fromIntegral i) 我认为它应该与 Integer 一起使用。
    • 你能帮我在示例邻居中真正写入矩阵的 de 字段吗?
    • 是的,谢谢你的帮助,但我问了一个关于这个例子的问题,我已经编辑过了,你能帮我吗
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多