Расчет матрицы расстояний
Я надеюсь, что у вас будет правильный ответ на этот вопрос, который довольно непростой.
У меня есть два одномерных вектора 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.