ここでは、行列演算を使用した解法があります。多くの場合、行と列、特に大きな行列のネストループよりも効率的です。
directionalSums <- function(x){
stopifnot(is.matrix(x))
# padding functions to allow matrix addition
padL <- function(x) cbind(-Inf,x)
padR <- function(x) cbind(x,-Inf)
padU <- function(x) rbind(-Inf,x)
padD <- function(x) rbind(x,-Inf)
# these padding functions are just for readability
padLU <- function(x) padL(padU(x))
padLD <- function(x) padL(padD(x))
padRU <- function(x) padR(padU(x))
padRD <- function(x) padR(padD(x))
m <- nrow(x)
n <- ncol(x)
sumR <- padR((padL(x) + padR(x))[1:m,2:n])
sumD <- padD((padU(x) + padD(x))[2:m,1:n])
sumRD <- padRD((padLU(x) + padRD(x))[2:m,2:n])
sumRU <- padRU((padRU(x) + padLD(x))[2:m,2:n])
list(`right`=sumR,
`down`=sumD,
`right and down`=sumRD,
`right and up`=sumRU)
}
試してみましょう。
(sumList <- directionalSums(ma))
maxLocList <- lapply(sumList, function(x) which(x==max(x), arr.ind=TRUE))
for (i in 1:length(maxLocList)){
nameD <- names(maxLocList)[i]
startCell <- maxLocList[[i]]
maxSum <- sumList[[i]][startCell]
x1 <- ma[startCell]
x2 <- maxSum - x1
writeLines(paste0('The max-sum consec. pair going ',
nameD, ' starts at [',
paste(startCell, collapse=', '),
'], with sum ', maxSum,
' and components ', x1, ' and ',x2)
)
}
戻り値:
$right
[,1] [,2] [,3] [,4]
[1,] 15 13 8 -Inf
[2,] 9 15 24 -Inf
[3,] 12 25 28 -Inf
[4,] 16 26 24 -Inf
$down
[,1] [,2] [,3] [,4]
[1,] 12 12 16 16
[2,] 7 14 26 26
[3,] 4 24 27 25
[4,] -Inf -Inf -Inf -Inf
$`right and down`
[,1] [,2] [,3] [,4]
[1,] 13 17 20 -Inf
[2,] 13 21 22 -Inf
[3,] 18 20 29 -Inf
[4,] -Inf -Inf -Inf -Inf
$`right and up`
[,1] [,2] [,3] [,4]
[1,] -Inf -Inf -Inf -Inf
[2,] 11 11 12 -Inf
[3,] 8 19 30 -Inf
[4,] 10 31 23 -Inf
The max-sum consec. pair going right starts at [3, 3], with sum 28 and components 16 and 12
The max-sum consec. pair going down starts at [3, 3], with sum 27 and components 16 and 11
The max-sum consec. pair going right and down starts at [3, 3], with sum 29 and components 16 and 13
The max-sum consec. pair going right and up starts at [4, 2], with sum 31 and components 15 and 16
'のS < - MA [1:3] + MA [2:4]。 (s == max(s)、arr.ind = TRUE) '行の最初のペアのインデックスを取得します。そのペアはそのすぐ下にあります。列の場合は、コンマを反転するだけです。対角線はもう少し作業になります。 – alistaire
対角線は 's < - ma [1:3,1:3] + ma [2:4,2:4]でなければなりません。これは(s == max(s)、arr.ind = TRUE) 'いいえ? – BonStats
あなたは最大の合計で連続したペアをお探しですか?それ以外の場合は、どのようにペアを比較しますか? – C8H10N4O2