最大化R中矩阵对角元素

fkaflof6  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(109)

编辑:一个相关的问题是How to move larger values close to matrix diagonal in a correlation matrix这个问题是关于实现相同的,但在R
给定一个矩阵(或R中的表)

m <- matrix(c(5,25,8,4,2,10,20,3,1),ncol=3,byrow=TRUE)
colnames(m) <- c("L","M","H")
rownames(m) <- c("A","B","C")
tax <- as.table(m)
tax
   L  M  H
A  5 25  8
B  4  2 10
C 20  3  1

字符串
我想重新排列矩阵,使对角元素最大。

H  L  M
B 10  4  2
C  1 20  3
A  8  5 25


R语言中有什么好用的函数吗?

vyswwuz2

vyswwuz21#

matrix.sort <- function(matrix) {

    if (nrow(matrix) != ncol(matrix)) stop("Not diagonal")
    if(is.null(rownames(matrix))) rownames(matrix) <- 1:nrow(matrix)

    row.max <- apply(matrix,1,which.max)
    if(all(table(row.max) != 1)) stop("Ties cannot be resolved")

    matrix[names(sort(row.max)),]
}

字符串

mwg9r5ms

mwg9r5ms2#

我不认为Rohit Arora的解决方案完全符合您的要求,因为它将由前一行的最大值引导。因此,它实际上并不是在优化意义上最大化对角线。
我在其他地方找到了一个类似问题的答案,我认为它可能有用:
http://r.789695.n4.nabble.com/reordering-of-matrix-rows-to-maximize-the-sum-of-the-diagonal-tt2062867.html#a2065679

pMatrix.min <- function(A, B) { 
#finds the permutation P of A such that ||PA - B|| is minimum in Frobenius norm 
# Uses the linear-sum assignment problem (LSAP) solver in the "clue" package 

# Returns P%*%A and the permutation vector `pvec' such that 
# A[pvec, ] is the permutation of A closest to B 
    n <- nrow(A) 
    D <- matrix(NA, n, n) 
    for (i in 1:n) { 
        for (j in 1:n) { 
        D[j, i] <- (sum((B[j, ] - A[i, ])^2)) 
        }
    } 
    vec <- c(solve_LSAP(D)) 
    list(A=A[vec,], pvec=vec) 
} 

require(clue)  # need this package to solve the LSAP 

#An example
A <- matrix(sample(1:25, size=25, rep=FALSE),  5,  5) 

B <- diag(1, nrow(A)) # this choice of B maximizes the trace of permuted A 

X <- pMatrix.min(A,B) 

A  # original square matrix 

X$A  # permuted A such that its trace is maximum among all permutations

字符串
它使用匈牙利方法来优化矩阵A到目标矩阵B的重新排序。
NB这是我的第一篇文章,所以我没有评论之前的答案的声誉,但我希望这有帮助!

s5a0g9ez

s5a0g9ez3#

我最近遇到了一个类似的问题,写了一个简单的函数来最大化一个方阵对角线上的元素之和。它不检查矩阵是否平方(它可以很容易地实现)。另外,要小心非常大的矩阵,因为排列的数量是列数的阶乘。

maxDiag <- function(x) {
  n <- ncol(x)
  per <- gtools::permutations(n,n)
  d <- apply(per,1,function(y) sum(diag(x[,y])))
  return(x[,per[which.max(d),]])
}

字符串

ntjbwcob

ntjbwcob4#

您可以简单地使用order + which.max来重新排列行和列,如下所示

> m[order(apply(m, 2, which.max)), order(apply(m, 1, which.max))]
   H  L  M
B 10  4  2
C  1 20  3
A  8  5 25

字符串

相关问题