Быстрое вычисление попарного косинусоидального направленного расстояния между точками в матрице (n x d x t)

Мне известно о pdist (X, distance) в Matlab, чтобы взять (nxd) матрицу точек и вычислить попарные расстояния между ними. Я также знаю, что у него есть дополнительная опция для вычисления косинусного расстояния, если матрица содержит векторы, а не точки.

Что я хотел бы сделать, так это взять матрицу (nxdxt), которая содержит различные позиции выборок во времени t и эффективно / быстро вычисляет косинусоидальное направленное расстояние между всеми парами / всеми кадрами, где av (t) определяется как направление поскольку вычисляется с помощью p (t + 1) - p (t), а p (t) относится к строке M (p,:, t).

Очевидно, я не хочу использовать циклы, если это может помочь. Какие-либо предложения?

Любая помощь очень ценится.


person oracle3001    schedule 21.04.2012    source источник
comment
Вы хотите рассчитать расстояние между всеми возможными парами, итого (n * t)(n * t - 1)/2 общее расстояние? Было бы полезно, если бы вы уточнили свой второй абзац.   -  person reve_etrange    schedule 22.04.2012
comment
Нет ... Я хочу вычислить расстояние между всеми парами векторов Vi и Vj ... где вектор Vi = pi (t + 1) - pi (t) ... и pi (t) хранится как столбец A (:,Это). то есть матрица A просто хранит все позиции всех точек с течением времени. НЕ НАПРАВЛЕННЫЕ ВЕКТОРЫ.   -  person oracle3001    schedule 22.04.2012


Ответы (1)


Напомним, что косинусное расстояние равно удвоенному евклидову расстоянию между нормализованными векторами. Это избавляет нас от многократного вычисления нормы в функции косинусного расстояния.

Похоже, вам нужны расстояния между разностью векторов при каждом изменении времени. Это верно?

data = diff(data,1,3);
[m,n,nt] = size(data);
data = reshape(data,m*nt,n);
data = data./repmat(sqrt(sum(data.^2,2)),1,n);
d = pdist(data);
d = d/2; %# The uniform scaling may not matter to you.
person reve_etrange    schedule 22.04.2012
comment
Предполагая, что вы имеете в виду все пары векторов ... каждый столбец представляет собой трехмерную позицию во времени. Мне нужно рассчитать направленный вектор между каждым периодом времени, а затем косинусным расстоянием. - person oracle3001; 22.04.2012
comment
data = data./reshape(sqrt(sum(data.^2,2)),1,3); ... что такое 1, 3? ... и это ошибки, когда я пробую. Чтобы ИЗМЕНИТЬ ИЗОБРАЖЕНИЕ, количество элементов не должно изменяться. - person oracle3001; 22.04.2012
comment
Моя плохая, я хотел сказать repmat. - person reve_etrange; 23.04.2012