0

我想知道在 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 的列表方法是否有更多功能性的方法来做到这一点?

干杯 NFV

4

2 回答 2

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))

将行分组并匹配每个组以使用andgrouped提取前半部分和后半部分taketakeRight

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)))

这将适用于方阵,您将不得不为其他大小的矩阵做更多的工作。

于 2013-08-05T23:25:08.153 回答
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)))
于 2018-01-11T01:59:17.817 回答