如果矩阵中的每个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.Matrix并submatrix创建此列表.并且该函数应具有以下模式:
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中实现它?
那么只使用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]