Scala中的简单矩阵计算

时间:2016-07-19 14:16:08

标签: scala matrix

假设我有一个整数矩阵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)} 
  }

有意义吗?你会如何简化这段代码?

1 个答案:

答案 0 :(得分:1)

您的代码确实有意义,但您可以添加一些可以扩展的工具,具体取决于您的资源。
如果将Spark与Scala代码结合使用(如果可行),您可以使用Spark可用的一些均值转换包。使用RDD可以完成许多相同的功能 https://spark-packages.org/?q=tags%3Alsh

如果这只是小规模的,那么这一切都不是必需的。