2013-01-16 62 views
0

我有用於存儲不同類型矩陣的代碼,例如, m1: Array[Array[Double]], m2: List[List[Int]]。如所看到的,這些矩陣全部被存儲爲一系列行。任何行都很容易檢索,但列在我看來需要遍歷矩陣。我想寫一個非常通用的函數,從這些類型的矩陣中返回一列。我已經在很多方面寫了這個,其中最新的是:scala矩陣的通用列訪問

/*獲取存儲在任何行矩陣的列*/

private def column(M: Seq[Seq[Any]], n: Int, c: Seq[Any] = List(), 
        i: Int = 0): List[Any] = { 
    if (i != M.size) column(M, n, c :+ M(i)(n), i+1) else c.toList 

這將編譯但它不工作:我得到當我嘗試傳入數組[數組[雙]]時,類型不匹配。我試圖用一些視圖邊界來寫這個,即

private def column[T1 <% Seq[Any], T2 <% Seq[T1]] ... 

但是這也不是富有成效的。我寫的第一個代碼段如何不起作用?做這個的最好方式是什麼?

回答

1

如果你不關心的返回類型,這是一個非常簡單的方法來做到這一點:

def column[A, M[_]](matrix: M[M[A]], colIdx: Int) 
    (implicit v1: M[M[A]] => Seq[M[A]], v2: M[A] => Seq[A]): Seq[A] = 
    matrix.map(_(colIdx)) 
0

試試這個:

private def column[T](
M: Seq[Seq[T]], n: Int, c: Seq[T] = List(), i: Int = 0): List[T] = 
    if (i != M.size) column(M, n, c :+ M(i)(n), i+1) else c.toList 
+0

沒有運氣:類型不匹配; [error] found:Array [Array [Double]] [error] required:Seq [Seq [Double]] [error]在涉及默認參數的應用程序中發生錯誤。 – akobre01

+0

我認爲你已經轉換到Seqs – pedrofurla

2
import collection.generic.CanBuildFrom 

def column[T, M[_]](xss: M[M[T]], c: Int)(
    implicit cbf: CanBuildFrom[Nothing, T, M[T]], 
      mm2s: M[M[T]] => Seq[M[T]], 
      m2s: M[T] => Seq[T] 
): M[T] = { 
    val bf = cbf() 
    for (xs <- mm2s(xss)) { bf += m2s(xs).apply(c) } 
    bf.result 
} 
1

我建議你代表一個矩陣作爲底層一維數組,並分別代表行方面的結構(唯一類型的數組有!)和列。

這使您在表示和訪問方面更加靈活。例如,您可以提供行主要和列主要組織。生成行迭代器就像生成列迭代器一樣簡單,無論它是行主要還是列主要組織。