Есть ли способ расчета попарного смещения вектора вместо использования вложенных циклов for? - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно рассчитать компоненты силы для каждой частицы в системе N частиц.Я легко могу найти величину расстояния между любыми двумя частицами, используя функцию pdist, но мне также нужно вычислить смещение xyz между каждой парой частиц.Pdist возвращает только величины и не указывает направление смещения.Существует ли эффективный способ вычисления компонентного смещения между парами векторов без использования вложенных циклов for?

Я использовал вложенные циклы for для вычисления смещения векторов между парами частиц, но это очень медленно.

функция гравитации (obj, G)

        obj.rho = squareform(1./((pdist(obj.state(:,1:3))).^3));
        obj.rho = tril(obj.rho) + triu(obj.rho);
        for i = 1:3
           obj.delta_xyz(:,:,i) = squareform(pdist(obj.state(:,i)));
           obj.F_xyz(:,i) = -sum(obj.rho.*obj.delta_xyz(:,:,i), 2);

Приведенный выше код работает намного быстрее, чем решение с вложенным циклом, но pdist вычисляет величины смещения компонента и, таким образом, направлениеневерный расчет силы для каждой частицы.

1 Ответ

0 голосов
/ 13 мая 2019

Как правило, P имеет положение N частиц в нужной форме Nx3:

N = 10;
P = rand(N, 3);

вы можете сгенерировать все индексные пары с помощью meshgrid, сохраняя уникальные пары i :

[i, j] = meshgrid(1:N, 1:N);
mask = i < j;
i = i(mask);
j = j(mask);

и вычислите смещения:

D = P(i, :) - P(j, :);

Расположение должно быть эквивалентно pdist, что эквивалентно:

dist = sqrt(sum(D.^2, 2)).'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...