List 首先查找列表中的所有元素,然后查找所有第二元素,然后查找所有第三元素等
使用自制的(9x9)矩阵定义,该矩阵被描述为List 首先查找列表中的所有元素,然后查找所有第二元素,然后查找所有第三元素等,list,haskell,matrix,transpose,List,Haskell,Matrix,Transpose,使用自制的(9x9)矩阵定义,该矩阵被描述为可能Ints的列表。我想创建一个函数,返回矩阵的9列。我想这样做: cols :: Matrix a -> [Block a] cols matrix = map (!! n) matrix where n = (the values 1 .. 9) 矩阵描述为[行]或[[值]] 块被描述为[a] 所以我希望输出是一个列表列表,其中这些列表是行的第一个元素的列表,行的第二个元素的列表,等等 我明白了 map (!! 1) matrix
可能Int
s的列表。我想创建一个函数,返回矩阵的9列。我想这样做:
cols :: Matrix a -> [Block a]
cols matrix = map (!! n) matrix
where
n = (the values 1 .. 9)
- 矩阵描述为
或[行]
[[值]]
- 块被描述为
[a]
map (!! 1) matrix
将返回行的第二个元素的列表,即矩阵的第二列;但是我不知道如何在一个好的函数中把它扩展到矩阵的所有列
我明白了
map (!! 1) matrix
将返回行的第二个元素的列表,即矩阵的第二列;但是我不知道如何在一个好的函数中把它扩展到矩阵的所有列
如果这是您想要的方式,您可以简单地将其更改为
map (!!i) matrix
在
[map(!!i)matrix | i let matrix=[[1,2,3],[4,5,6]]
前奏曲>[映射(!!i)矩阵| i如果我理解正确,您希望计算矩阵的:
import Data.List(transpose)
cols :: [[a]] -> [[a]]
cols = transpose
您可以通过以下方式高效地实现这一点:
cols :: [[a]] -> [[a]]
cols [] = []
cols ([]:_) = []
cols l = (map head l) : cols (map tail l)
此代码仅适用于矩形矩阵。代码的工作原理如下:如果我们给cols
一个空列表,或者第一行为空的列表,那么我们到达转置的末尾,因此返回一个空列表
另一方面,如果仍然有一个列表,并且第一行包含一个元素(因为矩阵是正方形的,所以另一行也是),我们首先将所有行的头作为列,然后对行的尾执行递归,以计算剩余的列
该函数以O(n)表示矩阵的元素数(不是行/列),或O(r×c)表示矩阵的行数,c表示矩阵的列数。为了便于参考(我知道你的目标是自己实现它):你想。这是完全正确的,起初我不知道transpose做了这件事,但@Ami Tavroy使用的正是我想了解更多的方法。谢谢你们!很好。出于好奇,“haskonic”是什么处理参差不齐矩阵的方法?@AmiTavory从决定参差不齐矩阵的输出开始,然后找到实现该目标的好方法。也就是说,有很多合理的“转置”方法不是矩阵的列表列表,只有选择其中一个才能找到惯用的解决方案。@AmiTavory:我认为问题确实在于如何定义不规则矩阵的转置。如果按列查看矩阵,则会发现存在间隙。如何处理这些间隙?为什么不喜欢内置的转置do是的,将它们粘在一起:transp[]=[];transp xs=concatMap(取1)xs:transp(filter(not.null)(map(drop 1)xs))
@AmiTavoryThank谢谢大家对评论的回答。
import Data.List(transpose)
cols :: [[a]] -> [[a]]
cols = transpose
cols :: [[a]] -> [[a]]
cols [] = []
cols ([]:_) = []
cols l = (map head l) : cols (map tail l)