从 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))
我在 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))