Расчет матрицы расстояний

Я надеюсь, что у вас будет правильный ответ на этот вопрос, который довольно непростой.

У меня есть два одномерных вектора Y и Z, которые содержат координаты N точки сетки, расположенные на квадратной сетке. Так

Ny points along Y
Nz points along Z
N = Ny*Nz
Y = Y[N]; (Y holds N entries)
Z = Z[N]; (Z holds N entries)

Теперь цель будет генерировать матрицу расстояний D, который держит N*N записи: так каждая строка матрицы D определяется как расстояние между i-й точкой на сетке и остаточными (N - i) точками.

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

D = squareform(pdist([Y Z]));

или, что то же самое,

D = pdist2([Y Z],[Y Z]).

Но с тех пор D симметричная матрица, я хотел бы генерировать только N(N + 1)/2 независимые записи и сохранить их в упорядоченный вектор Dd,

Вопрос в том, как сгенерировать упорядоченный массив строк. Dd чьи записи определяются нижними треугольными членами матрицы D? Кроме того, я хотел бы хранить записи в порядке столбцов.

Я надеюсь, что объяснение достаточно ясно.

1 ответ

Как прокомментировали деревянные щепки, проще и быстрее вычислить всю матрицу и извлечь нужные вам элементы. Вот способ сделать это:

ndx = find(tril(true(size(D))));
Dd = D(ndx);

Если вам абсолютно необходимо вычислить элементы Dd без вычислительной матрицы D Во-первых, вам, вероятно, нужен двойной цикл for.

Другие вопросы по тегам