2016-05-24 7 views
0

Я вычисляю матрицу расстояния между большим количеством мест (5000) на сфере (используя функцию расстояния Хаверсина).R: Ускоренный способ вычисления большой матрицы расстояний

Вот мой код:

require(geosphere) 
x=rnorm(5000) 
y=rnorm(5000) 
xy1=cbind(x,y) 

Время, необходимое для вычисления матрицы расстояний является

system.time(outer(1:nrow(xy1), 1:nrow(xy1), function(i,j) distHaversine(xy1[i,1:2],xy1[j,1:2]))) 

Время, необходимое для выполнения этой программы высока. Любое предложение о том, как снизить потребление времени для выполнения этой работы! Благодарю.

+1

вы можете попробовать альтернативную реализацию. см. http://www.r-bloggers.com/computational-efficiency-of-great-circle-distance-calculations-in-r/ – Leo

+2

@Leo в чистой совесть и без смысла обидеть Я должен указать, что связанный статья * ужасный *! Автор использует цикл 'for' для циклического перехода через вектор, чтобы повторно вызвать функцию (' distHaversine() '), которая уже * vectorised * !! Они писали * более * код, а также замедляли скорость выполнения примерно на 300X !!! Не слушайте эту статью! Вы не вызываете функцию 10000 раз, когда будете делать это! –

+0

Привет @ SimonO'Hanlon, спасибо за головы. :-) – Leo

ответ

2

Попробуйте встроенную функцию в комплекте geosphere?

z <- distm(xy1) 

Функция расстояния по умолчанию для distm() - который вычисляет матрицу расстояний между множеством точек - это Haversine ("distHaversine") формула, но вы можете указать другой с помощью fun аргумента.

На моем 2.6MHz Core i7 rMBP это занимает около 5 секунд для 5000 пунктов.

+0

Спасибо за ваше предложение. Это выполнение занимает меньше половины времени, чем мой код. – Janak