如何使用scala将矩阵拆分为子矩阵

时间:2013-08-05 21:49:16

标签: scala

我想知道在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

2 个答案:

答案 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对行进行分组并匹配每个组以使用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)))

这适用于方形矩阵,你必须为其他尺寸的矩阵做更多的工作。

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