Это может быть не самый удачный способ, но он будет делать то, что вы хотите:
//Assuming the table consists of pairs
val table: List[(Double, Double)] =
List(
1.0 -> 11.0,
2.0 -> 12.0,
3.0 -> 13.0,
4.0 -> 14.0,
5.0 -> 15.0,
6.0 -> 16.0
)
println(table)
// The following assumes we want the matrix as a List of rows, where each row is a List[Double]
// Get the columns of table
val t1 = table.map(_._1)
val t2 = table.map(_._2)
// Make the first row separately, since it is different from the others
val firstRow = 0.0 :: t2
// Make the other rows - start with value from first column, then the diagonal matrix entries
val otherRows = t1.zipWithIndex.map { case (a, row) =>
a :: t1.indices.toList.map(i => if (i == row) 1.0/6.0 else 0.0)
}
// Assemble the whole matrix
val matrix = firstRow :: otherRows
// Matrix as List[List[Double]
println(matrix)
// Printed
println(matrix.map(row => row.map(a => f"$a%.3f").mkString("\t")).mkString("\n"))
Я поместил этот код в скаляре здесь
Окончательный результат:
0.000 11.000 12.000 13.000 14.000 15.000 16.000
1.000 0.167 0.000 0.000 0.000 0.000 0.000
2.000 0.000 0.167 0.000 0.000 0.000 0.000
3.000 0.000 0.000 0.167 0.000 0.000 0.000
4.000 0.000 0.000 0.000 0.167 0.000 0.000
5.000 0.000 0.000 0.000 0.000 0.167 0.000
6.000 0.000 0.000 0.000 0.000 0.000 0.167