2012-04-21 1 views
0

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

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

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

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

+0

Вы хотите рассчитать расстояние между всеми возможными парами, так что '(n * t) (n * t - 1)/2' полные расстояния? Это поможет, если вы уточните свой второй абзац. –

+0

Нет ... Я хочу рассчитать расстояние между всеми парами векторов Vi и Vj ... где вектор Vi = pi (t + 1) - pi (t) ... и pi (t) сохраняется как столбец А (:, я, т). т. е. матрица А просто сохраняет все позиции всех точек с течением времени. НЕ НАПРАВЛЯЮЩИЕ ВЕКТОРЫ. – oracle3001

ответ

0

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

Похоже, вы хотите, чтобы расстояния между векторной разницей с каждым изменением во времени. Это верно?

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. 
+0

«Предполагая, что вы имеете в виду все пары векторов» ... каждый столбец является трехмерным положением во времени. Мне нужно рассчитать вектор направленности между каждым периодом времени и затем расстоянием косинуса. – oracle3001

+0

data = data./reshape(sqrt(sum(data.^2,2)),1,3); ... что такое 1, 3? ... и это ошибки, когда я пытаюсь это сделать. «Для РЕАГИРОВАНИЯ количество элементов не должно меняться». – oracle3001

+0

Мой плохой, чтобы сказать 'repmat'. –

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