有没有一种方法可以计算成对矢量位移,而不是使用嵌套的for循环?

时间:2019-05-12 20:12:04

标签: matlab

我需要计算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);

上面的代码比嵌套的for循环解决方案运行快得多,但是pdist计算组件位移的大小,因此对每个粒子的力计算方向不正确。

1 个答案:

答案 0 :(得分:0)

通常,P的{​​{1}}粒子处于所需形状N的位置:

Nx3

您可以使用N = 10; P = rand(N, 3); 生成所有索引对,并保持唯一对 i

meshgrid

并计算位移:

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

该安排应与D = P(i, :) - P(j, :); 的安排相同,该安排等效于:

pdist