Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 首先查找列表中的所有元素,然后查找所有第二元素,然后查找所有第三元素等_List_Haskell_Matrix_Transpose - Fatal编程技术网

List 首先查找列表中的所有元素,然后查找所有第二元素,然后查找所有第三元素等

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

使用自制的(9x9)矩阵定义,该矩阵被描述为
可能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)