2012-02-28 3 views
2

фонУпрощает использование meshgrid в Matlab

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

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

Проблема

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

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

Вопрос

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


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

ответ

1

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

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

С помощью:

Выход D расположена в порядке ((2,1), (3,1), ..., (м, 1), (3,2), ... (m, 2), ..... (m, m-1)), т. Е. Нижний левый треугольник полной m-m-матрицы расстояния в порядке столбцов. Чтобы получить расстояние между i-м и j-м наблюдениями (i < j), либо используйте формулу D ((i-1) * (m-i/2) + j-i), либо используйте вспомогательную функцию Z = squareform (D), которая возвращает квадратную симметричную матрицу m-by-m, причем запись (i, j) равна расстоянию между наблюдением i и наблюдением j.

+0

+1 - Но только если у вас есть stat. ящик для инструментов. –

+0

@Andrey: Но вы должны иметь это, во всяком случае :) – Jonas

+0

@Jonas, извините, не получил шутку O_o –

1

Вы можете создать 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; 

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

+0

Да, возможно, путем умножения нижней диагонали (и самой диагонали) на нуль и затем каким-то образом отфильтровать эти значения? –

+0

@ Самуэль, да, желательно с NaNs. Я уверен, что вы можете думать о пути :) –

Смежные вопросы