Минимальная стоимость расстояния в матрице - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть эта матрица ниже

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 ]

0 голосов
/ 06 ноября 2018

Рад, что наконец-то смог решить проблему ... Код также работает быстро

Задача: найти минимальную стоимость матрицы. Для ясности предположим, что у меня есть матрица, приведенная ниже:

[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

Моя цель - добавить минимальное расстояние пути, начиная с первого ряда ката [1,1] до последнего ряда К [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
0 голосов
/ 05 ноября 2018

Поскольку вы не приводите минимальный воспроизводимый пример, я могу только догадываться:

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)

Надеюсь, это поможет.

...