R中矩阵对角元的最大化

R中矩阵对角元的最大化,r,optimization,matrix,correlation,R,Optimization,Matrix,Correlation,编辑:一个相关的问题是这个问题是关于实现同样的目标,但在R 给定一个矩阵(或R中的表格) R中有任何易于使用的函数吗?matrix.sortmatrix.sort我认为Rohit Arora的解决方案并没有完全按照您的要求执行,因为它将由前一行的最大值引导。因此,它实际上并不是在优化意义上最大化对角线 matrix.sort <- function(matrix) { if (nrow(matrix) != ncol(matrix)) stop("Not diagonal")

编辑:一个相关的问题是这个问题是关于实现同样的目标,但在R

给定一个矩阵(或R中的表格)


R中有任何易于使用的函数吗?

matrix.sort
matrix.sort我认为Rohit Arora的解决方案并没有完全按照您的要求执行,因为它将由前一行的最大值引导。因此,它实际上并不是在优化意义上最大化对角线

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)),]
}
我在别处找到了一个类似问题的答案,我认为这可能有用:


pMatrix.min我不认为Rohit Arora的解决方案完全符合您的要求,因为它将由前一行的最大值引导。因此,它实际上并不是在优化意义上最大化对角线

我在别处找到了一个类似问题的答案,我认为这可能有用:


pMatrix.min通常不可能同时最大化多个对象。这意味着你的目标是不明确的:你需要更精确地决定哪一个数字最大化。一旦你澄清了这一点,请将你的问题转发到主题上。我只想重新排列行和列,使最大值位于对角线处。这里什么是“不清楚的”?您刚刚澄清了什么原本是一个不适定的编程问题。现在很明显你想要做什么,这很可能会在上的主题上被考虑。对角线元素的顺序重要吗?我发现了一个相同的问题,但对于Matlab,我在寻找相同的,但在R!!!一般来说,不可能同时最大化多个事物。这意味着你的目标是不明确的:你需要更精确地决定哪一个数字最大化。一旦你澄清了这一点,请将你的问题转发到主题上。我只想重新排列行和列,使最大值位于对角线处。这里什么是“不清楚的”?您刚刚澄清了什么原本是一个不适定的编程问题。现在很明显你想要做什么,这很可能会在上的主题上被考虑。对角线元素的顺序重要吗?我发现了一个相同的问题,但对于Matlab,我在寻找相同的,但在R!!!您可以将
apply(matrix,1,which.max)
替换为
setNames(max.col(matrix),rownames(matrix))
以提高效率。您可以将
apply(matrix,1,which.max)
替换为
setNames(max.col(matrix),rownames(matrix))
以提高效率。
   H  L  M
B 10  4  2
C  1 20  3
A  8  5 25
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)),]
}
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