温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Sorting a matrix whilst preserving the diagonal in R?
matrix r

其他 - 排序矩阵,同时保留R中的对角线?

发布于 2020-04-07 10:52:32

我想知道是否存在一种通用的方式来对中的对称矩阵进行排序R,同时保留对角线值。

例如,如果我有一个像这样的矩阵:

# Create Matrix -----------------------------------------------------------
offdiag <- c(rep(1:6))
m <- matrix(NA, ncol = 4, nrow = 4,dimnames = list(c("A","B","C","D"), c("A","B","C","D")))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- 0
m

产生这个:

  A B C D
A 0 1 2 3
B 1 0 4 5
C 2 4 0 6
D 3 5 6 0

在上面的示例中,值C和D共享最大值。因此,我想实现的是对矩阵进行重新排序,以使最大值位于上三角的左上方(但不改变对角线0)。

因此,如果我要手工明确地重新排列矩阵,则最终结果将是:

# Create sorted matrix by hand --------------------------------------------
A <- c(2,3,0,1)
B <- c(4,5,1,0)
C <- c(0,6,2,4)
D <- c(6,0,3,5)

matr <- cbind(C,D,A,B)
rownames(matr) <- c("C","D","A","B")
matr 

会产生:

  C D A B
C 0 6 2 4
D 6 0 3 5
A 2 3 0 1
B 4 5 1 0

我想知道的是,是否有一种方法可以像我的示例一样对(n X n)矩阵进行一般排序?

查看更多

提问者
Electrino
被浏览
56
ThomasIsCoding 2020-01-31 23:36

也许您可以尝试下面的代码

q <- which(colSums(m == max(m))>0,arr.ind = T)
o <- c(q, seq(ncol(m))[-q])
mout <- m[o,o]

这样

> mout
  C D A B
C 0 6 2 4
D 6 0 3 5
A 2 3 0 1
B 4 5 1 0