Как создать такую ​​матрицу в scala? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть таблица типа

ID    Name
1      11
2      12
3      13
4      14
5      15
6      16

Я хочу создать матрицу, используя эту таблицу. Матрица должна быть такой:

0   11   12   13   14   15   16  

1   1/6  0    0     0   0    0

2   0   1/6   0     0   0    0

3   0    0    1/6   0   0    0  

4   0    0    0   1/6   0    0

5   0    0    0    0   1/6   0

6   0    0    0     0   0    1/6

Где индекс i равен j, то есть i = j => 1/6, иначе 0.

1 Ответ

2 голосов
/ 16 февраля 2020

Это может быть не самый удачный способ, но он будет делать то, что вы хотите:

//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
...