矩阵中所有2x2子矩阵中每个元素的总和

Hen*_*und 0 haskell matrix

如果矩阵中的每个2x2子矩阵的总和具有偶数行和列,我需要获得一个列表.

例如,假设我们有一个4x4矩阵(1); 函数应该如下计算它(我只想指出给定矩阵可以是任何nxm矩阵,其中n和m是偶数):

(1): [ [1,  2, 3, 4],
       [5,  6, 7, 8],
       [9, 10,11,12],
       [13,14,15,16] ]

sum2x2 of (1):
    1. 1+2+5+6    = 14
    2. 3+4+7+8    = 22
    3. 9+10+13+14 = 46
    .
    .


result: [14, 22, 46, ...]
Run Code Online (Sandbox Code Playgroud)

我想使用Data.Matrixsubmatrix创建此列表.并且该函数应具有以下模式:

sum2x2 :: Matrix Double -> [Double]
Run Code Online (Sandbox Code Playgroud)

我已经开始编写这个函数,但我不知道如何从这里开始:

sum2x2 :: Matrix Double -> [Double]
sum2x2 m = if even (ncols m) && even (nrows m)
  then what?
  else error "sum2x2 takes only even matrices"
Run Code Online (Sandbox Code Playgroud)

submatrix 的工作原理如下:

-- | /O(1)/. Extract a submatrix given row and column limits.
--   Example:
--
-- >                   ( 1 2 3 )
-- >                   ( 4 5 6 )   ( 2 3 )
-- > submatrix 1 2 2 3 ( 7 8 9 ) = ( 5 6 )
submatrix :: Int    -- ^ Starting row
          -> Int -- ^ Ending row
          -> Int    -- ^ Starting column
          -> Int -- ^ Ending column
          -> Matrix a
          -> Matrix a
Run Code Online (Sandbox Code Playgroud)

所以,我有这个概念.如何使用列表理解在Haskell中实现它?

Igo*_*dov 5

那么只使用sum矩阵函数呢,因为它是可折叠的实例?

import Data.Matrix

sum2x2 :: Matrix Double -> Double
sum2x2 m = if even (ncols m) && even (nrows m)
  then sum m
  else error "sum2x2 takes only even matrices"

main :: IO ()
main = print $ sum2x2 (fromList 2 2 [1..])
Run Code Online (Sandbox Code Playgroud)

此示例创建一个矩阵((1, 2), (3, 4))并返回总和10.我想,sum2x2应该是的类型sum2x2 :: Matrix Double -> Double而不是sum2x2 :: Matrix Double -> [Double]

您可能还会发现splitBlocks函数很有用.

splitBlocks 2 2 matrix4x4
Run Code Online (Sandbox Code Playgroud)

创建一个类型的元组(Matrix a, Matrix a, Matrix a, Matrix a),这是你正在寻找的矩阵.

如果问题是将任何M x N(当然是偶数Ms和Ns)矩阵转换为2 x 2矩阵列表,那么以下实现可能会有所帮助:

to2x2Martices m =
  [submatrix x1 x2 y1 y2 m | (x1, x2) <- rawPairs, (y1, y2) <- columnPairs]
  where
    pairs [] = []
    pairs (x:y:xs) = (x, y) : pairs xs

    rawPairs = pairs [1..(nrows m)]
    columnPairs = pairs [1..(ncols m)]
Run Code Online (Sandbox Code Playgroud)

逻辑是迭代行中的每一对和列中的每一对,并获得2 x 2这些对的矩阵.

它转换了以下矩阵:

(  1  2  3  4 )
(  5  6  7  8 )
(  9 10 11 12 )
( 13 14 15 16 )
Run Code Online (Sandbox Code Playgroud)

进入以下列表:

[(  1  2 )
(  5  6 )
,(  3  4 )
(  7  8 )
,(  9 10 )
( 13 14 )
,( 11 12 )
( 15 16 )
]
Run Code Online (Sandbox Code Playgroud)

因此,您只需映射列表并获取每个元素的总和.

map sum $ to2x2Martices (fromList 4 4 [1..])
Run Code Online (Sandbox Code Playgroud)

评估为 [14,22,46,54]