我到处都是StackOverflow和其他论坛,以寻求解决方案,但尚未找到仅使用Base-R的解决方案-这正是我需要使用的解决方案。
我正在尝试逐行最大化NxN矩阵中的对角线,因此该行的最大值位于对角线上(我希望这是有意义的-特别是在聚类分析的背景下)
到目前为止,我已经尝试过对此进行硬编码,但感觉却适得其反-这是通过尝试创建一个“交换”函数,使用for循环向下的列并交换所需的条目来完成的。 即在第1行: 1,3,4,7-> 7,3,4,1 第2行: 4,10,14,22-> 4,22,14,10 等等
这是我尝试使用的矩阵示例:
CM <- table(expected, predicted)
CM
1 2 3 4
A 11 1 0 66
B 0 22 77 18
C 10 49 34 48
D 0 46 31 49
#Desired:
CM
1 2 3 4
A 66 1 0 11 #max 66
B 0 77 22 18 #max 77
C 10 34 49 48 #max 49
D 0 46 31 49 #max 49
这里是(糟糕的)交换函数的摘录,无法正常工作。
swap <- function(x,y){
a = c() #create an empty vector
a <- x #assign x value to a (where x = diagonal location)
x <- y #assign y to x (where y = maximum value
y <- a #re-assign a value back to y
}
以上显示了我对结果的期望-我希望有人可以为我提供一些有用的伪代码,或者让我知道是否有任何我想念的东西。
很抱歉,这是一个简单或明显的问题!
答案 0 :(得分:2)
因此,看来,您想逐行循环遍历矩阵,并通过将max元素与对角线上的元素交换来更改每一行。我的想法是使用此交换功能:
swap <- function(matrixRow,x,y){
#x is diagonal index
#y is max of the row
indexY <- which(matrixRow == y)
valX <- matrixRow[x]
matrixRow[x] <- y
matrixRow[indexY] <- valX
return(matrixRow)
}
这将返回该行的更改版本。然后,您可以将此行的新版本分配给当前行。例如,
vals <- c(11,0,10,0, 1,22,49,46, 0, 77, 34, 31, 66, 18, 48, 49)
mat <- matrix(vals, nrow = 4)
编辑:woops击错了键,并且发布得太早。剩下的就是这
for(i in 1:nrow(mat)){
rowI <- mat[i,]
y <- max(rowI)
mat[i,] <- swap(rowI, i, y)
}
答案 1 :(得分:2)
执行此操作的先前方法是实现Hungarian algorithm。
仅在每一行中选择最大值并不一定会使对角线最大化,因为在一行中的最大值可能略胜于次优,而选择第二个最大值将使您在另一行上获得更大的值。