Функция Raycast в r для выборки из матрицы между двумя точками - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь использовать R для вычисления среднего и стандартного отклонения всех пикселей в растре, лежащем между двумя точками.Я написал функцию, которая делает что-то близкое к этому, в результате чего я создаю последовательность равномерно распределенных точек между начальной и конечной точкой, сэмплируем из растра, а затем вычисляю среднее и стандартное отклонение.

К сожалению, из-за сложных соглашений об обмене данными с моими сотрудниками я не могу поделиться какими-либо данными здесь, однако я могу поделиться своими сценариями.

Это функция для вычисления среднего и стандартного отклонения

meanstdv <- function(data,ras,x,y) {
  require(raster)
  test=SpatialPoints(approx(c(data$X[which((data$OBSERVED==1)&(data$REFID==x-1))],data$X[which((data$REFID==x)&(data$SAMPLEID==y))]),c(data$Y[which((data$OBSERVED==1)&(data$REFID==x-1))],data$Y[which((data$REFID==x)&(data$SAMPLEID==y))]),n=Mod(diff(c(data$Z[which((data$OBSERVED==1)&(data$REFID==x-1))],data$Z[which((data$REFID==x)&(data$SAMPLEID==y))])))))
  averages=mean(extract(ras, test))
  stdevs=sd(extract(ras, test))
  dataindex=which((data$REFID==x)&(data$SAMPLEID==y))
  layerval=cbind(dataindex,averages,stdevs)
  return(layerval)
}

Затем я пытаюсь применить эту функцию ко всему моему фрейму данных с помощью следующей параллельной функции применения

library(parallel)
cl <- makeCluster(32)
clusterEvalQ(cl, source("meanstdv.R"))
clusterExport(cl, "data")
clusterExport(cl, "raster")

inner_loop = function(i)
{
  onestep = lapply(1:31, function(j) try(meanstdv(data=data,ras=raster,x=i,y=j)))
  onestep2 = do.call(rbind, onestep)
}


outer_loop_parallel = parallel::parLapply(cl,2:length(levels(data$REFID)), function(i) try(inner_loop))
stopCluster(cl)

Фрейм данных имеет 17718843 строки, а размеры растра - 4533 X 4991. Кажется, что это работает, но очень медленно.Коллега выполнил некоторые профилирования для меня, и оказалось, что реальные расчеты занимают почти нет времени, но более 90% времени уходит на сборку мусора.Это напрасная трата времени.Я думаю, что это связано с моей зависимостью от растрового пакета.Моей первой мыслью относительно решения было загрузить мой растр в виде матрицы и использовать функцию, аналогичную функции raycast () в matlab

Документация Raycast

Я могне могу найти ничего похожего на это в R, и я не уверен, как воссоздать это сам.Есть ли способ создать функцию raycast в R, или есть какой-то другой, более эффективный способ достичь того, что я пытаюсь сделать?

...