Упрощение использования сетки в Matlab - PullRequest
2 голосов
/ 28 февраля 2012

Фон

Расширение этого вопроса.У меня есть набор точек (в системе с тремя осями, то есть с координатами (x, y, z)), и я хочу вычислить расстояние между каждой точкой.

Для этого мне сначала нужно сделатьМатрица со всеми возможными комбинациями точек (желательно без дубликатов, чтобы сэкономить на времени обработки), чтобы затем рассчитать все расстояния.

Задача

Теперь я пытаюсьиспользуйте для этого meshgrid, но это становится довольно сложно.Это становится сложным, потому что (x, y, z) координаты находятся в матрице, которая отформатирована как: pointCoordinates[x,y,z,pointnumber]

И я не знаю, как сказать meshgrid просто объединить точку-1 иточка-2 и т. д., не комбинируя также все отдельные x-координаты со всеми отдельными y-координатами и т. д. (которые представляют собой слишком много комбинаций, большинство из которых бесполезны).

Вопрос

Как мне мешать сетке сетки создавать избыточные комбинации координат?Или есть более простой способ сделать это?


Я думаю, я мог бы переформатировать матрицу pointCoordinates в простой строковый массив points (с таким количеством записей, сколько имеется координат),Где первая запись (1,3,5), вторая (2,4,2) и т. Д. Таким образом, сохраняя координаты вместе, и ограничивая количество возможных комбинаций.Но это кажется излишним.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Существует действительно более простой способ. Если вы хотите рассчитывать только избыточные точки, вы можете использовать pdist . Обратите внимание, что вы можете выбрать метрику расстояния, отличную от евклидовой.

distances = pdist(pointCoordinates(:,1:3));

Из справки:

Выход D расположен в порядке ((2,1), (3,1), ..., (м, 1), (3,2), ... (м, 2), ..... (m, m – 1)), то есть нижний левый треугольник полной матрицы расстояний m-на-m в порядке столбцов. Чтобы получить расстояние между i-м и j-м наблюдениями (i

1 голос
/ 28 февраля 2012

Вы можете создать 3 сетки, для x, y и z.

 x = pointCoordinates(:,1);
 y = pointCoordinates(:,2);
 z = pointCoordinates(:,3);

 [X1,X2] = meshgrid(x,x);
 [Y1,Y2] = meshgrid(y,y);
 [Z1,Z2] = meshgrid(z,z);

Затем вычислите расстояние для каждого:

 (X1-X2).^2 + (Y1-Y2).^2 + (Z1-Z2).^2;

Теперь вам нужно извлечь нижнюю диагональную часть, поскольку есть дубликаты.

...