Когда pdist вычисляет расстояния между парами наблюдений (1,2, ..., n), расстояния располагаются в следующем порядке:
(2,1), (3,1), ..., (м, 1), (3,2), ..., (м, 2), ..., (м, м – 1))
Чтобы продемонстрировать это, попробуйте следующее:
> X = [.2 .1 .7 .5]';
> D = pdist(X)
.1 .5 .3 .6 .4 .2
В этом примере X хранит n = 4 наблюдения.Результат, D, представляет собой вектор расстояний между наблюдениями (2,1), (3,1), (4,1), (3,2), (4,2), (5,4).Это расположение соответствует элементам нижней треугольной части следующей n-n-матрицы:
M =
0 0 0 0
.1 0 0 0
.5.6 0 0
.3 .4 .2 0
Обратите внимание, что D ( 1 ) = M ( 2,1 ), D (2 ) = ( 3,1 ) и так далее.Таким образом, один из способов получить пару индексов в M, которые соответствуют D (k), состоит в том, чтобы вычислить линейный индекс для D (k) в M. Это можно сделать следующим образом:
% matrix size
n = 4;
% r(j) is the no. of elements in cols 1..j, belonging to the upper triangular part
r = cumsum(1:n-1);
% p(j) is the no. elements in cols 1..j, belonging to the lower triangular part
p = cumsum(n-1:-1:1);
% The linear index of value D(k)
q = find(p >= k, 1);
% The subscript indices of value D(k)
[i j] = ind2sub([n n], k + r(q));
Обратите внимание, что n, r и p нужно устанавливать только один раз.С этого момента вы можете найти индекс для любого заданного k, используя последние две строки.Давайте проверим это:
for k = 1:6
q = find(p >= k, 1);
[i, j] = ind2sub([n n], k + r(q));
fprintf('D(%d) is the distance between observations (%d %d)\n', k, i, j);
end
Вот вывод:
D (1) - расстояние между наблюдениями (2 1)
D (2) - расстояние между наблюдениями (3 1)
D (3) - расстояние между наблюдениями (4 1)
D (4) - расстояние между наблюдениями (3 2)
D (5) - расстояние между наблюдениями (4 2)
D (6) - расстояние между наблюдениями (4 3)