我正在尝试优化这段代码并摆脱实现的嵌套循环。我发现将矩阵应用于 pdist 函数时遇到困难

例如, 1+j//-1+j//-1+j//-1-j 是初始点,我试图通过最小距离方法检测 0.5+0.7j 到它所属的点。
任何帮助表示赞赏

function result = minDisDetector( newPoints, InitialPoints)
result = [];
for i=1:length(newPoints)
    minDistance = Inf;
    for j=1:length(InitialPoints)

        X = [real(newPoints(i)) imag(newPoints(i));real(InitialPoints(j)) imag(InitialPoints(j))];
        d = pdist(X,'euclidean');

        if d < minDistance
            minDistance = d;
            index = j;
        end
    end
    result = [result; InitialPoints(index)];
end
end

最佳答案

您可以使用 Speed-efficient classification in Matlab 中列出的高效欧几里德距离计算来计算 vectorized solution -

%// Setup the input vectors of real and imaginary into Mx2 & Nx2 arrays
A = [real(InitialPoints) imag(InitialPoints)];
Bt = [real(newPoints).' ; imag(newPoints).'];

%// Calculate squared euclidean distances. This is one of the vectorized
%// variations of performing efficient euclidean distance calculation using
%// matrix multiplication linked earlier in this post.
dists = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt];

%// Find min index for each Bt & extract corresponding elements from InitialPoints
[~,min_idx] = min(dists,[],1);
result_vectorized = InitialPoints(min_idx);

使用 newPoints 作为 400 x 1 & InitialPoints 作为 1000 x 1 的快速运行时测试:
-------------------- With Original Approach
Elapsed time is 1.299187 seconds.
-------------------- With Proposed Approach
Elapsed time is 0.000263 seconds.

关于matlab - MATLAB 中复杂向量的高效分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29860637/

10-11 22:32
查看更多