Расстояния между двумя списками векторов положения

Я пытаюсь получить матрицу, которая содержит расстояния между точками в двух списках.

Вектор точек содержит широту и долготу, и расстояние можно вычислить между любыми двумя точками, используя функцию 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 используя этот вход (см. ссылку выше). Результат затем снова собирается в красивую матрицу.
Другие вопросы по тегам