【问题标题】:Is there a way to calculate pairwise vector displacement rather than using nested for loops?有没有办法计算成对矢量位移而不是使用嵌套的 for 循环?
【发布时间】:2019-05-13 05:00:38
【问题描述】:

我需要计算 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计算的是分量位移的大小,所以每个粒子的力计算方向是不正确的。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    一般情况下,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)).'
    

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 2019-11-08
      • 2019-06-05
      • 2020-08-11
      • 2018-11-29
      • 2023-03-26
      • 2020-01-06
      • 2020-09-14
      • 2023-03-04
      相关资源
      最近更新 更多