scala矩阵的通用列访问

时间:2013-01-16 18:16:16

标签: scala types functional-programming

我有代码存储不同类型的矩阵,例如m1: Array[Array[Double]], m2: List[List[Int]]。如图所示,这些矩阵都被存储为一系列行。任何行都很容易检索,但在我看来,列需要遍历矩阵。我想编写一个非常通用的函数,它从这些类型的矩阵中返回一列。我用很多方式写过这个,其中最新的是:

/ *获取存储在行* /

中的任何矩阵的列
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

这编译然而它不起作用:当我尝试传入一个数组[Array [Double]]时,我得到一个类型不匹配。我试图用一些视图边界写这个,即

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

但这也不富有成效。为什么我写的第一个代码段不起作用?这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分: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 :(得分:1)

我建议你将Matrix表示为底层的一维数组(唯一的数组!),并按行和列分别表示其结构。

这使您在表示和访问方面具有更大的灵活性。例如,您可以提供行主要和列主要组织。生成行迭代器就像生成列迭代器一样简单,无论它是行主要组还是列主要组织。

答案 2 :(得分: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))

答案 3 :(得分: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