是否有一种方法可以计算成对矢量位移,而不是使用嵌套进行循环



我需要计算N粒子系统中每个粒子上的力分量。我可以使用PDIST函数轻松地找到任何两个粒子之间的距离的大小,但是我还需要计算每对粒子之间的XYZ位移。PDIST仅返回大小,并不表示位移方向。是否有一种有效的方法来计算矢量对之间的组件明智位移,而无需嵌套进行循环?

我使用嵌套的环来计算粒子对之间的矢量位移,但这非常慢。

功能重力(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计算了组件位移的幅度,因此每个粒子上力计算的方向是不正确的。

通常, P在所需的形状Nx3中具有N粒子的位置:

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

您可以使用meshgrid生成所有索引对,并保留唯一对 i<J

[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)).'

最新更新