从 Scala 中的列表构建矩阵的功能方法

Functional way to build a matrix from the list in scala

我在 https://users.scala-lang.org/ 上问过这个问题,但还没有得到具体的答案。我得到了一个向量 v,我想根据下面指定的规则基于该向量构建一个矩阵 m。我想以纯函数的方式编写以下代码,即 m = v.map(...) 或类似的。我可以通过这样的程序方式轻松完成

import scala.util.Random

val v =  Vector.fill(50)(Random.nextInt(100))
println(v)

val m = Array.fill[Int](10, 10)(0)

def populateMatrix(x: Int): Unit = m(x/10)(x%10) += 1

v.map(x => populateMatrix(x))

m foreach { row => row foreach print; println }

换句话说,我正在遍历 v,从每个 v(k) 获取一对索引 (i,j) 并在这些位置更新矩阵 m,即, m(i)(j) += 1。但我正在寻求一种功能性的方式。我很清楚如何在例如数学

v=RandomInteger[{99}, 300]
m=SparseArray[{Rule[{Quotient[#, 10] + 1, Mod[#, 10] + 1}, 1]}, {10, 10}] & /@ v // Total // Normal

但是在函数式语言scala中如何实现呢?

您的填充矩阵方法可以“反转”- 将向量映射到索引元组中,将它们分组,计算每组的大小并将其转换为映射(索引元组 -> 大小),用于在中填充相应的索引Array.tabulate:

数组
val v =  Vector.fill(50)(Random.nextInt(100))
val values = v.map(i => (i/10, i%10))
  .groupBy(identity)
  .view
  .mapValues(_.size)
val result = Array.tabulate(10,10)( (i, j)=> values.getOrElse((i,j), 0))