假设我有一个整数矩阵a
,并且需要创建一个新矩阵b
,以便b[i, j]
是a[i, j]
及其邻居的总和。
我将矩阵定义为Array[Array[Int]]
并编写一个函数foo
来计算b
,如下所示:
type Matrix = Array[Array[Int]]
def sumOfNeighbors(a: Matrix, x: Int, y: Int): Int = {
val range = -1 to 1
val deltas = range.flatMap { dx => range map {dy => (dx, dy)} }
.filter { case (dx, dy) => dx != 0 || dy != 0 }
val withinBounds: Int => Boolean = x => x >= 0 && x < a.size
val coords = deltas.map {case (dx, dy) => (x + dx, y + dy)}
.filter {case (i, j) => withinBounds(i) && withinBounds(j)}
coords.map{case (i, j) => a(i)(j)}.sum
}
def foo(a: Matrix): Matrix =
a.zipWithIndex map {case (row, i) =>
row.zipWithIndex.map {case (x, j) => x + sumOfNeighbors(a, i, j)}
}
有意义吗?你会如何简化这段代码?
答案 0 :(得分:1)
您的代码确实有意义,但您可以添加一些可以扩展的工具,具体取决于您的资源。
如果将Spark与Scala代码结合使用(如果可行),您可以使用Spark可用的一些均值转换包。使用RDD可以完成许多相同的功能
https://spark-packages.org/?q=tags%3Alsh
如果这只是小规模的,那么这一切都不是必需的。