如何根据Haskell中的块变换矩阵
我想要一个函数,它接受一个整数如何根据Haskell中的块变换矩阵,haskell,matrix,Haskell,Matrix,我想要一个函数,它接受一个整数n,一个大小为(n*n)x(n*n),并返回一个矩阵,其中每个块(大小为nxn)现在是一行,通过从左到右,然后从上到下对块进行排序 例如: type Matrix a = [[a]] chunks :: Int -> Matrix a -> Matrix a chunks n = ... 示例:chunk2a==b a b +--+--+ +--+--+ |ab|cd| |ab|ef| |ef|gh|
n
,一个大小为(n*n)x(n*n)
,并返回一个矩阵,其中每个块(大小为nxn
)现在是一行,通过从左到右,然后从上到下对块进行排序
例如:
type Matrix a = [[a]]
chunks :: Int -> Matrix a -> Matrix a
chunks n = ...
示例:chunk2a==b
a b
+--+--+ +--+--+
|ab|cd| |ab|ef|
|ef|gh| |cd|gh|
+--+--+ --> +--+--+
|ij|kl| |ij|mn|
|mn|op| |kl|op|
+--+--+ +--+--+
示例:chunks 3c==d
c d
+---+---+---+ +---+---+---+
|abc|def|ghi| |abc|jkl|stu|
|jkl|mno|pqr| |def|mno|vwx|
|stu|vwx|yzA| |ghi|pqr|yzA|
+---+---+---+ +---+---+---+
|BCD|EFG|HIJ| |BCD|KLM|TUV|
|KLM|NOP|QRS| --> |EFG|NOP|WXY|
|TUV|WXY|Z$%| |HIJ|QRS|Z$%|
+---+---+---+ +---+---+---+
|...|...|...| |...|...|...|
|...|...|...| |...|...|...|
|...|...|...| |...|...|...|
+---+---+---+ +---+---+---+
***编辑:
答案是:
chunks :: Int -> [[a]] -> [[a]]
chunks n m = concat (map chunks' (splitEvery n m))
where
chunks' :: [[a]] -> [[a]]
chunks' m = map concat (transpose (map (splitEvery n) m))
我想我也应该定义splitEvery
:
splitEvery :: Int -> [a] -> [[a]]
splitEvery _ [] = []
splitEvery n xs = chunk : (splitEvery n xxs)
where
(chunk, xxs) = splitAt n xs
以下是一些提示:
请注意,某些元素始终保持在一起。例如,在2x2的情况下,“ab”
保持在一起,“cd”
、“ef”
、“gh”
,等等。事实上,您可以通过以下方式可视化转换:
+---+---+ +---+---+
| 1 | 2 | | 1 | 3 | 1 = ab
| 3 | 4 | | 2 | 4 | 2 = cd
+---+---+ ---> +---+---+ 3 = ef
| 5 | 6 | | 5 | 7 | 4 = gh
| 7 | 8 | | 6 | 8 | 5 = ...
+---+---+ +---+---+
并观察每一行如何变换:
1 2 -> 1 3
3 4 2 4
5 6 -> 5 7
7 8 6 8
想想你的线性代数课。进行这些转换吗
看起来眼熟吗?请注意,对角线元素不会移动
现在从数据列表中查看本节,然后
查看这些功能之一是否适用:
重要的是要了解到目前为止您已经尝试了什么,即使是在不同的编程语言中,以及您遇到的困难。这是家庭作业吗?没关系,多亏了用户5402,我现在算出来了。我没有想到使用转置
,尽管我已经在程序的其他地方使用了它。不,这不是家庭作业。这是写一个解决数独难题的程序。将数据块包装到列表中非常有用,这样我就可以轻松地对其执行进一步的操作,例如将其转换为多组候选值。在这种情况下,您可能想看看这个实验室),它将指导您逐步在Haskell中构建数独解算器。谢谢,但我不需要它。我已经完成了99%,而且我的算法比他在使用猜测之前做的检查更聪明。我以前的chunks
函数运行良好,但仅适用于9x9拼图。我只是想要一个可以处理任何大小的拼图的函数。