Упорядочение матрицы для максимального значения в каждой диагонали - PullRequest
0 голосов
/ 19 апреля 2019

Я осмотрел 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

}

выше показывает, как я быожидайте результатов - я надеялся, что кто-нибудь может предоставить мне какой-нибудь полезный псевдокод или сообщить мне, если я что-то упустил.

Извините, если это простой или очевидный вопрос!

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Предыдущий способ сделать это - реализовать венгерский алгоритм .

. Просто выбор максимума в каждой строке не обязательно максимизирует диагональ, поскольку максимум в одной строке может бытьнезначительно лучше второго лучшего, тогда как выбор второго лучшего позволит вам получить гораздо большее значение в другом ряду.

2 голосов
/ 19 апреля 2019

Итак, глядя на это, кажется, что вы хотите циклически проходить по матрице строка за строкой и изменять каждую строку, меняя элемент 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)
}
...