我想知道在Scala中最正确的方法是:
我想初始化一个像以下
这样的矩阵0 1 2 3
0 1 2 3
0 1 2 3
0 1 2 3
然后id喜欢把它分成4个块:
0 1 | 2 3
0 1 | 2 3
---------
0 1 | 2 3
0 1 | 2 3
最终得到4个矩阵:
0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3
我可以想到使用循环等方法来实现它的几种方法,但是使用scala的list方法有更多功能方法吗?
干杯 NFV
答案 0 :(得分:1)
将矩阵定义为列表列表。
scala> val matrix = List(List(0,1,2,3),List(4,5,6,7), List(8,9,10,11),List(11,12,13,14))
matrix: List[List[Int]] = List(List(0, 1, 2, 3), List(4, 5, 6, 7), List(8, 9, 10, 11), List(11, 12, 13, 14))
使用grouped
对行进行分组并匹配每个组以使用take
和takeRight
提取上半部分和后半部分
scala> matrix.grouped(2).flatMap(xs => xs match {
| case x: List[List[Int]] => List(x.head.take(2) ::: x.last.take(2), List(x.head.takeRight(2) ::: x.last.takeRight(2)))
| })
res0: Iterator[List[Any]] = non-empty iterator
scala> res0.toList
res1: List[List[Any]] = List(List(0, 1, 4, 5), List(List(2, 3, 6, 7)), List(8, 9, 11, 12), List(List(10, 11, 13, 14)))
这适用于方形矩阵,你必须为其他尺寸的矩阵做更多的工作。
答案 1 :(得分:0)
假设一个方形矩阵的大小可以被2整除:
scala> val size = 4
size: Int = 4
scala> val matrix = List.fill(size)(List.range(0,size))
matrix: List[List[Int]] = List(List(0, 1, 2, 3), List(0, 1, 2, 3), List(0, 1, 2, 3), List(0, 1, 2, 3))
scala> matrix.map(_.grouped(size/2).toList).grouped(size/2).map(_.transpose).reduce(_ ++ _)
res0: List[List[List[Int]]] = List(List(List(0, 1), List(0, 1)), List(List(2, 3), List(2, 3)), List(List(0, 1), List(0, 1)), List(List(2, 3), List(2, 3)))