Matlab最近邻/跟踪点

Matlab nearest neighbor / track points

我有一组 n 复数,它们从时间步长 1nsampl 穿过复平面。我想绘制这些数字及其随时间的轨迹(y 轴显示虚部,x 轴显示实部)。这些数字存储在 n x nsampl 向量中。但是,在每个时间步中,n 点的顺序是随机的。因此,在每个时间步中,我在最后一个时间步中选择一个点,在当前时间步中找到它最近的邻居并将其放在与当前点相同的位置。然后我对所有其他 n-1 点重复该操作并继续下一个时间步。这样,上一步中的每个点都与新步骤中的一个点关联(1:1 关系)。下面给出了我当前的实现和示例。但是我的实现速度非常慢(10 x 4000 复数大约需要 10 秒)。因为我想同时增加设置大小 n 和时间范围 nsampl 这对我来说真的很重要。有没有更聪明的方法来实现它以获得一些性能?

n=3 且 nsampl=2 的示例:

%manually create a test vector X
X=zeros(3,2); % zeros(n,nsampl)
X(:,1)=[1+1i; 2+2i; 3+3i];
X(:,2)=[2.1+2i; 5+5i; 1.1+1.1i]; % <-- this is my vector with complex numbers

%vector sort algorithm
for k=2:nsampl
    Xlast=[real(X(:,k-1)) imag(X(:,k-1))];          % create vector with x/y-coords from last time step
    Xcur=[real(X(:,k)) imag(X(:,k))];               % create vector with x/y-coords from current time step
    for i=1:size(X,1) % loop over all n points
        idx = knnsearch(Xcur(i:end,:),Xlast(i,:));  %find nearest neighbor to Xlast(i,:), but only use the points not already associated, thus Xcur(i:end,:) points
        idx = idx + i - 1;
        Xcur([i idx],:) = Xcur([idx i],:);          %sort nearest neighbor to the same position in the vector as it was in the last time step
    end
    X(:,k) = Xcur(:,1)+1i*Xcur(:,2);                %revert x/y coordinates to a complex number
end

结果:

X(:,2)=[1.1+1.1i; 2.1+2i; 5+5i];

谁能帮我加快这段代码的速度?

您要解决的问题是组合优化,它可以通过 the hungarian algorithm (aka munkres). Luckily there is a implementation for matlab available for download. 下载文件并将其放在您的搜索路径或函数旁边。使用它的代码是:

for k=2:size(X,2)
   %build up a cost matrix, here cost is the distance between two points.
   pairwise_distances=abs(bsxfun(@minus,X(:,k-1),X(:,k).'));
   %let the algorithm find the optimal pairing
   permutation=munkres(pairwise_distances);
   %apply it
   X(:,k)=X(permutation,k);
end