R中矩阵对角元的最大化
编辑:一个相关的问题是这个问题是关于实现同样的目标,但在R 给定一个矩阵(或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中有任何易于使用的函数吗?
matrix.sortmatrix.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