在处理大型多维数组的单个矩阵相关方法的范围内,性能和内存使用至关重要。我们需要就地改变数组的元素,因此正在使用 ArrayBuffer(而不是 Array)。
考虑到这个用例,有没有一种方法可以使用 ..yield 来生成 ArrayBuffer(或至少是可变集合)而不是不可变的?
以下代码显示了意图 - 尽管它无法编译:
def classify(inarr: Array[Double], arrarr: Array[Array[Double]], labels: Array[String], K: Int): String = {
...
var diffmat: ArrayBuffer[ArrayBuffer[Double]] = for (row <- arrarr) yield {
(ArrayBuffer[Double]() /: (row zip inarr)) {
(outrow, cell) => outrow += cell._1 - cell._2
}
}
编译错误是:
Expression Array[ArrayBuffer[Double]] does not conform to expected type ArrayBuffer[ArrayBuffer[Double]]
最佳答案
啊...突破的“魔法洒水”案例。它不仅可以为您提供所需的集合类型,而且可以高效地完成此操作,而不会浪费额外的转换。
object Foo {
import scala.collection.mutable.ArrayBuffer
import scala.collection.breakOut
val inarr: Array[Double] = Array()
val arrarr: Array[Array[Double]] = Array()
var diffmat: ArrayBuffer[ArrayBuffer[Double]] = (for (row <- arrarr) yield {
(ArrayBuffer[Double]() /: (row zip inarr)) {
(outrow, cell) => outrow += cell._1 - cell._2
}
})(breakOut)
}
最终的文章(恕我直言)是 Daniel Sobral's answer .
关于arrays - 从 Scala 中的 for 循环生成 ArrayBuffer(或其他可变 Collection 类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228122/