R语言 如何使这样的矩阵更有效?

6mzjoqzu  于 2023-05-26  发布在  其他
关注(0)|答案(3)|浏览(195)
distances <- cbind(c(0,1,2,3,4,5,6,7,8,9),
                   c(1,0,1,2,3,4,5,6,7,8),
                   c(2,1,0,1,2,3,4,5,6,7),
                   c(3,2,1,0,1,2,3,4,5,6),
                   c(4,3,2,1,0,1,2,3,4,5),
                   c(5,4,3,2,1,0,1,2,3,4),
                   c(6,5,4,3,2,1,0,1,2,3),
                   c(7,6,5,4,3,2,1,0,1,2),
                   c(8,7,6,5,4,3,2,1,0,1),
                   c(9,8,7,6,5,4,3,2,1,0))

有没有更简单的方法来制作这个矩阵?

mkh04yzy

mkh04yzy1#

> toeplitz(0:9)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    1    2    3    4    5    6    7    8     9
 [2,]    1    0    1    2    3    4    5    6    7     8
 [3,]    2    1    0    1    2    3    4    5    6     7
 [4,]    3    2    1    0    1    2    3    4    5     6
 [5,]    4    3    2    1    0    1    2    3    4     5
 [6,]    5    4    3    2    1    0    1    2    3     4
 [7,]    6    5    4    3    2    1    0    1    2     3
 [8,]    7    6    5    4    3    2    1    0    1     2
 [9,]    8    7    6    5    4    3    2    1    0     1
[10,]    9    8    7    6    5    4    3    2    1     0
hgc7kmma

hgc7kmma2#

给定v <- seq(10),您可以尝试dist

> as.matrix(dist(v))
   1 2 3 4 5 6 7 8 9 10
1  0 1 2 3 4 5 6 7 8  9
2  1 0 1 2 3 4 5 6 7  8
3  2 1 0 1 2 3 4 5 6  7
4  3 2 1 0 1 2 3 4 5  6
5  4 3 2 1 0 1 2 3 4  5
6  5 4 3 2 1 0 1 2 3  4
7  6 5 4 3 2 1 0 1 2  3
8  7 6 5 4 3 2 1 0 1  2
9  8 7 6 5 4 3 2 1 0  1
10 9 8 7 6 5 4 3 2 1  0

> dist(v, diag = TRUE, upper = TRUE)
   1 2 3 4 5 6 7 8 9 10
1  0 1 2 3 4 5 6 7 8  9
2  1 0 1 2 3 4 5 6 7  8
3  2 1 0 1 2 3 4 5 6  7
4  3 2 1 0 1 2 3 4 5  6
5  4 3 2 1 0 1 2 3 4  5
6  5 4 3 2 1 0 1 2 3  4
7  6 5 4 3 2 1 0 1 2  3
8  7 6 5 4 3 2 1 0 1  2
9  8 7 6 5 4 3 2 1 0  1
10 9 8 7 6 5 4 3 2 1  0

outer + abs

> abs(outer(v, v, `-`))
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    1    2    3    4    5    6    7    8     9
 [2,]    1    0    1    2    3    4    5    6    7     8
 [3,]    2    1    0    1    2    3    4    5    6     7
 [4,]    3    2    1    0    1    2    3    4    5     6
 [5,]    4    3    2    1    0    1    2    3    4     5
 [6,]    5    4    3    2    1    0    1    2    3     4
 [7,]    6    5    4    3    2    1    0    1    2     3
 [8,]    7    6    5    4    3    2    1    0    1     2
 [9,]    8    7    6    5    4    3    2    1    0     1
[10,]    9    8    7    6    5    4    3    2    1     0
ou6hu8tu

ou6hu8tu3#

使用matrixlower.tri的“手动”方法

DoMat <- function(Cols){
  Dist <- matrix(0:Cols, nrow=Cols+1, ncol=Cols, byrow=T)[-(Cols+1),]
  Dist[lower.tri(Dist)] <- t(Dist)[lower.tri(t(Dist))]
  Dist
}

DoMat(10)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    1    2    3    4    5    6    7    8     9
 [2,]    1    0    1    2    3    4    5    6    7     8
 [3,]    2    1    0    1    2    3    4    5    6     7
 [4,]    3    2    1    0    1    2    3    4    5     6
 [5,]    4    3    2    1    0    1    2    3    4     5
 [6,]    5    4    3    2    1    0    1    2    3     4
 [7,]    6    5    4    3    2    1    0    1    2     3
 [8,]    7    6    5    4    3    2    1    0    1     2
 [9,]    8    7    6    5    4    3    2    1    0     1
[10,]    9    8    7    6    5    4    3    2    1     0

相关问题