我有代码存储不同类型的矩阵,例如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]] ...
但这也不富有成效。为什么我写的第一个代码段不起作用?这样做的最佳方式是什么?
答案 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