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

如何使用scala将矩阵拆分为子矩阵,scala,Scala,我想知道在Scala中最正确的方法是什么: 我想初始化一个矩阵,如下所示 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 以4个矩阵结束: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 我可以想出一些使用循环等的方法,但是有没有更多的功能性方法可以使用scala的列表方法呢 干杯 NFV将矩阵定义为列表列表

我想知道在Scala中最正确的方法是什么:

我想初始化一个矩阵,如下所示

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
以4个矩阵结束:

0 1   2 3   0 1   2 3
0 1   2 3   0 1   2 3
我可以想出一些使用循环等的方法,但是有没有更多的功能性方法可以使用scala的列表方法呢

干杯
NFV将矩阵定义为列表列表

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))
使用分组的
对行进行分组
,并使用
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)))

这将适用于方阵,您还需要对其他大小的矩阵做更多的工作。

假设方阵的大小可以被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)))

你是如何表示你的矩阵的?原始矩阵的大小是固定的吗?或者它会变化,但沿每个轴始终是2的倍数?尝试使用
Seq
和它的方法
grouped(size:Int)
,看看你能想出什么。。如果您遇到问题,请返回一些代码,看看我们是否可以帮助改进您的方法。@MyseriousDan-我是scala的新手,因此对您非常开放suggestions@RichardSitze可以假设大小为正方形,evenThanks为解决方案Brian,使用您的代码,我想出了一种方法将其应用于任何大小的矩阵