Oto sposób, aby to zrobić za pomocą prostego (ale długiego) kodu.
Ponieważ szukasz pary o największej liczbie kolejnych, powinieneś najpierw utworzyć funkcję, która pobiera komórkę i znajduje wszystkie jej kolejne sumy.
consec <- function(ma,y,x){
return(
c(if(x<ncol(ma)) ma[y,x] + ma[y,x+1],
if(x>1) ma[y,x] + ma[y,x-1],
if(y<nrow(ma)) ma[y,x] + ma[y+1,x],
if(y>1) ma[y,x] + ma[y-1,x],
if(x<ncol(ma) & y<nrow(ma)) ma[y,x] + ma[y+1,x+1],
if(x>1 & y<nrow(ma)) ma[y,x] + ma[y+1,x-1],
if(x<ncol(ma) & y>1) ma[y,x] + ma[y-1,x+1],
if(x>1 & y>1) ma[y,x] + ma[y-1,x-1])
)
}
Lewa połowa tej funkcji (sprawozdania if
) upewnić się, że nie wykraczają poza granice, ponieważ komórka na granicy będzie mieć mniej niż 8 sąsiadów, aby utworzyć parę z rzędu. Prawa połowa, a następnie get jest sumą kolejnych par i dodaje ją do listy.
Teraz, jeśli użyjesz consec(ma, 3, 2)
, otrzymasz wektor sum następujących po sobie wartości dla ma[3,2]
.
Następnie chcemy wypełnić drugą macierz z najwyższą kolejną sumą dla każdej komórki. Możesz użyć następującego kodu, aby utworzyć pustą macierz o odpowiednich wymiarach.
ma2 <- matrix(0, nrow = nrow(ma), ncol = ncol(ma))
Teraz wypełnij go za pomocą pętli i utworzonej wcześniej funkcji consec
.
for(i in 1:nrow(ma)){
for(j in 1:ncol(ma)){
ma2[i,j] <- max(consec(ma,i,j))
}
}
Teraz, gdy mamy macierz kolejnych sum, możemy znaleźć największe sumy w nim, a współrzędne to będzie odpowiadać, gdzie chcemy szukać w oryginalnej matrycy.
ma.max <- which(ma2 == max(ma2), arr.ind = TRUE)
Teraz, jeśli istnieje tylko jedna para liczb, która jest maksymalna, a następnie ma.max
będzie mieć dwie linie (dwie permutacje tej samej pary). Możesz użyć:
ma[ma.max[1,1], ma.max[1,2]]; ma[ma.max[2,1], ma.max[2,2]]
Aby je wyświetlić. W takim przypadku otrzymujemy 15
i 16
, więc zadziałało.
Jeśli masz więcej maksimów, zwiększ liczbę w powyższym kodzie, aby uzyskać następną parę (3 i 4) i tak dalej. Możesz nawet zmodyfikować funkcję consec
, na przykład, jeśli nie chcesz kolejnych przekątnych, a następnie usuń ostatnie cztery wiersze listy.
'S <- MA [1: 3] + MA [2: 4]; which (s == max (s), arr.ind = TRUE) 'dla uzyskania indeksów pierwszej pary dla wierszy; jego para będzie bezpośrednio pod nim. W przypadku kolumn możesz po prostu przerzucić przecinki. Diagonale będą nieco więcej pracy. – alistaire
Przekątne powinny być po prostu 's <- ma [1: 3,1: 3] + ma [2: 4,2: 4]; który (s == max (s), arr.ind = TRUE) 'nie? – BonStats
szukasz następnej pary o największej sumie? W przeciwnym razie, jak porównać pary? – C8H10N4O2