Соответствующая матричная конструкция
Я работаю над нарушением равновесия, и выход программного обеспечения выглядит следующим образом: Рисунок текущий
то, что я на самом деле хочу, это соответствующая половина матрицы, а также 1 на диагонали, как это: Рисунок ожидается
Мне было интересно, если это легко сделать в R или Python? Спасибо за помощь.
2 ответа
Решение
> library(sem)
> mat <- matrix(1:64, 8, 8)
> mat[lower.tri(mat)] <- 0
>
> diag(mat) <- 1
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 9 17 25 33 41 49 57
[2,] 0 1 18 26 34 42 50 58
[3,] 0 0 1 27 35 43 51 59
[4,] 0 0 0 1 36 44 52 60
[5,] 0 0 0 0 1 45 53 61
[6,] 0 0 0 0 0 1 54 62
[7,] 0 0 0 0 0 0 1 63
[8,] 0 0 0 0 0 0 0 1
> mat[lower.tri(mat)] <- t(mat)[lower.tri(mat)]
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 9 17 25 33 41 49 57
[2,] 9 1 18 26 34 42 50 58
[3,] 17 18 1 27 35 43 51 59
[4,] 25 26 27 1 36 44 52 60
[5,] 33 34 35 36 1 45 53 61
[6,] 41 42 43 44 45 1 54 62
[7,] 49 50 51 52 53 54 1 63
[8,] 57 58 59 60 61 62 63 1
Вы можете сделать это с помощью Python и NumPy легко:
import numpy as np
# Create the empty matrix
d = np.zeros((8,8))
# Create the upper triangular matrix
d[0,2:]=1
d[1,2]=0.839
d[1,3]=1
d[1,4:6]=0.736
d[1,6:]=0.864
d[2,3:]=1
d[3,4:]=1
d[4,5:]=1
d[5,6:]=1
d[4:6,7]=0.933
d[6,7]=0.88
print(d)
# Create the full matrix with transpose and identity matrix
dFUll = d + d.T + np.eye(8)
print(dFull)