взаимное расстояние между каждыми 2 точками в 3D - PullRequest
1 голос
/ 05 июня 2011
rv=[rx ry rz];   %# [N-by-3] rx , ry , rz are [N-by-1]

for i=1:N
    for j=1:N
        dx(i,j)=rv(i,1)-rv(j,1);    %# dx is x component of distance between each 2 points [N-by-N]
        dy(i,j)=rv(i,2)-rv(j,2);
        dz(i,j)=rv(i,3)-rv(j,3);
    end
end
d=cat(3,dx,dy,dz);

Существует ли более быстрый способ построения d ?

Большое спасибо за любое руководство.

Редактировать:

N= 997 
Me:               Elapsed time is 17.271125 seconds.
DiggyF:           Elapsed time is 0.241841 seconds.
Oli Charlesworth: Elapsed time is 0.120425 seconds.
N=1986 
DiggyF          : Elapsed time is 1.183639 seconds.
Oli Charlesworth: Elapsed time is 0.502964 seconds.

Ответы [ 2 ]

2 голосов
/ 05 июня 2011

Вот метод, который избегает явных циклов:

dx = repmat(rx, 1, N) - repmat(rx.', N, 1);

Я не знаю, будет ли это работать быстрее; тебе придется попробовать!

1 голос
/ 05 июня 2011

Это также будет работать:

dx = meshgrid(rx) - meshgrid(rx)'
dy = meshgrid(ry) - meshgrid(ry)'
dz = meshgrid(rz) - meshgrid(ry)'

Также посмотрите на функцию pdist , если у вас есть набор инструментов статистики или октава.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...