2013-08-05 41 views
0

我想知道什麼是最正確的方式在Scala中這樣做是爲了分割矩陣爲子矩陣是:如何使用Scala的

Id喜歡初始化像下面

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 

0 1 | 2 3 
0 1 | 2 3 
--------- 
0 1 | 2 3 
0 1 | 2 3 

要使用4點矩陣最終

我可以考慮一些方法來做到這一點循環等,但有更多的功能的方式來使用scala的列表方法嗎?

乾杯 NFV

+0

你是如何代表你的矩陣? –

+0

原始矩陣的大小是否固定?或者它會有所不同,但是每個軸始終都是2的倍數? –

+1

嘗試使用'Seq'和它的方法'分組(尺寸:Int)',看看你能想出什麼..如果你遇到問題,回來一些代碼,看看我們是否可以幫助改進你的方法。 –

回答

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

上半年和下半年這將工作的方陣,你就必須做一些提取更多的工作爲其他大小的矩陣。

+0

我會給你一個去! – nfvindaloo

+0

感謝您的解決方案Brian,使用您的代碼我想出了一種方法將其應用於任何大小的矩陣 – nfvindaloo

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