Расстояния между двумя списками векторов положения
Я пытаюсь получить матрицу, которая содержит расстояния между точками в двух списках.
Вектор точек содержит широту и долготу, и расстояние можно вычислить между любыми двумя точками, используя функцию distCosine в пакете геосферы.
> Points_a
lon lat
1 -77.69271 45.52428
2 -79.60968 43.82496
3 -79.30113 43.72304
> Points_b
lon lat
1 -77.67886 45.48214
2 -77.67886 45.48214
3 -77.67886 45.48214
4 -79.60874 43.82486
Я хотел бы получить матрицу, которая будет выглядеть так:
d_11 d_12 d_13
d_21 d_22 d_23
d_31 d_32 d_33
d_41 d_42 d_43
Я изо всех сил пытаюсь придумать способ генерирования матрицы без просто циклического повторения по Points_a и Points_b и расчета каждой комбинации. Может ли кто-нибудь предложить более элегантное решение?
1 ответ
Решение
Вы можете использовать это:
outer(seq(nrow(Points_a)),
seq(nrow(Points_b)),
Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
)
(по совету @CarlWitthoft)
В зависимости от желаемого результата, который вы публикуете, возможно, вы захотите транспонировать t()
этого или просто заменить _a
с _b
выше.
РЕДАКТИРОВАТЬ: некоторые объяснения:
seq(nrow(Points_x))
: создает последовательность от 1 до количества строкPoints_x
;distCosine(Points_a[i,], Points_b[j,])
: выражение для вычисления расстояния между точками, заданными строкойi
изPoints_a
и грестиj
изPoints_b
;function(i, j)
: делает вышеуказанную безымянную функцию с двумя параметрами;Vectorize(...)
: убедитесь, что, учитывая входыi
а такжеj
Если длина больше единицы, то безымянная функция выше вызывается только один раз для каждого элемента векторов (см. это для получения дополнительной информации);outer(x, y, f)
: создает "расширенные" векторыx
а такжеy
такие, что все комбинации его элементов присутствуют, и вызываетf
используя этот вход (см. ссылку выше). Результат затем снова собирается в красивую матрицу.