我在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索引中獲取一對索引,并在這些位置更新矩陣,即。但我正在尋找一種實用的方式。我很清楚如何在例如 Mathematica 中實作這一點(i,j)v(k)mm(i)(j) = 1
v=RandomInteger[{99}, 300]
m=SparseArray[{Rule[{Quotient[#, 10] 1, Mod[#, 10] 1}, 1]}, {10, 10}] & /@ v // Total // Normal
但是如何在函式式語言 scala 中做到這一點呢?
uj5u.com熱心網友回復:
您的填充矩陣方法可以“反轉” - 將向量映射到索引元組,將它們分組,計算每個組的大小并將其轉換為映射(索引元組 - > 大小),該映射將用于填充陣列中的相應索引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://www.uj5u.com/gongcheng/424389.html
標籤:斯卡拉 矩阵 向量 函数式编程 wolfram-mathematica
下一篇:函式定義中的型別邊界錯誤
