Минимальная стоимость расстояния в матрице
У меня есть эта матрица ниже
k
[,1] [,2] [,3] ,4][,5] [,6]
[1,] 1 4 9 16 25 36
[2,] 1 3 7 13 21 31
[3,] 2 2 5 10 17 26
[4,] 4 2 4 8 14 22
[5,] 7 3 3 6 11 18
[6,] 11 5 3 5 9 15
и я хочу перебрать начиная с k[1,1]
и заканчивается в k[6,6]
, Мои критерии зацикливания основаны на min(k[i,j+1], k[i+1,j], k[i+1, j+1])
и ответ я надеюсь получить что-то вроде 1+1+2+2+3+3+5+9+15 = 41
(путешествие по минимальной дорожке)
Так что в значительной степени он рассчитывает минимум, начиная с k[1,1]
а затем продолжается вниз до k[6,6]
warpingDist = function(x, y, z){
mincal = numeric(length(k))
m = nrow(k)
n = ncol(k)
i=1
j=1
mincal = which(k == min(k[i, j+1], k[i+1, j], k[i+1, j+1]), arr.ind = TRUE)
indx = data.frame(mincal)
i= indx$row
j= indx$col
if(i != m || j!=n)
{
warpingDist(k[i, j+1], k[i+1, j], k[i+1, j+1])
}
warpSum = sum(mincal)
return(warpSum)
}
value = apply(k, c(1,2), warpingDist)
value
Когда я запускаю этот код, он отображает ниже:
Error: object 'value' not found
Не уверен, почему это происходит...
2 ответа
Поскольку вы не предоставите минимальный воспроизводимый пример, я могу только догадываться:
warpingDist = function(x, y, z, k){
# browser() # This is a good option to activate, if you run your script in RStudio
...
return(warpSum)
}
# your code
k <- whatever it is
result <- warpingDist(x, y, z, k)
Надеюсь, это поможет.
Я рад, что наконец-то смог решить проблему... Код также работает быстро
Задача: найти минимальную стоимость матрицы. Для ясности предположим, что у меня есть матрица, приведенная ниже:
[1,] 1 4 6 7 8 9 0
[2,] 10 12 1 3 11 2 0
[3,] 11 12 2 8 17 1 0
[4,] 20 1 18 4 28 1 0
[5,] 5 20 80 6 9 3 0
Моя цель состоит в том, чтобы добавить минимальное расстояние пути, начиная с первой строки kata[1,1] до последней строки K[5,4]. Поэтому я хочу иметь что-то вроде 1 + 4 + 1 + 2 + 4 + 6 + 9 + 3.
Ниже приведен код R, который я использовал для реализации этого. Он реализует две функции:
# Function that calculates minimum of three values. Returns the Value.
minFUN <- function(Data, a, b){
d = (min(Data[a, b+1], Data[a+1, b], Data[a+1, b+1]))
return(d)
}
# Function that calculates the index of the minimum value, from which the
# The next iteration begins
NextRC <- function(Data, a, b){
d = min(Data[a, b+1], Data[a+1, b], Data[a+1, b+1])
if(d == Data[a, b+1]){
c = cbind(a, b+1)
}else
if(d == Data[a+1, b]){
c = cbind(a+1, b)
} else
if(d == Data[a+1, b+1]){
c = cbind(a+1, b+1)
}
return(c)
}
Je <- c()
NewRow = 1
NewCol = 1
# Warping Function that uses both functions above to loop through the dataset
WarpDist <- function(Data, a = NewRow, b = NewCol){
for(i in 1:4) {
Je[i] = minFUN(Data, a, b)
# Next Start Point
NSP = NextRC(Data, a,b)
NewRow = as.numeric(NSP[1,1])
NewCol = as.numeric(NSP[1,2])
a = NewRow
b = NewCol
}
return(Je)
}
Value=WarpDist(Data = Data, a = NewRow, b = NewCol)
warpo = Data[1,1] + sum(Value)
w = sqrt(warpo)
Результатом является минимальный путь от первой строки до последней строки
Value
[1] 4 1 2 4 6
Результат пропускает 9 и 3, потому что он уже в последнем ряду.
Время:
Time difference of 0.08833408 secs