1

有什么方法可以提高此功能的性能吗?它包含一个嵌套的 for 循环。如何进行 MatLab 向量化?

有什么方法可以for从以下代码中删除循环?

function [ mhd ] = ModHausdorffDist( A, B )


Asize = size(A);
Bsize = size(B);

% Check if the points have the same dimensions
if Asize(2) ~= Bsize(2)
    error('The dimensions of points in the two sets are not equal');
end

% Calculating the forward HD

fhd = 0;                    % Initialize forward distance to 0
for a = 1:Asize(1)          % Travel the set A to find avg of d(A,B)
    mindist = Inf;          % Initialize minimum distance to Inf
    for b = 1:Bsize(1)      % Travel set B to find the min(d(a,B))
        tempdist = norm(A(a,:)-B(b,:));
        if tempdist < mindist
            mindist = tempdist;
        end
    end
    fhd = fhd + mindist;    % Sum the forward distances
end
fhd = fhd/Asize(1);         % Divide by the total no to get average

% Calculating the reverse HD

rhd = 0;                    % Initialize reverse distance to 0
for b = 1:Bsize(1)          % Travel the set B to find avg of d(B,A)
    mindist = Inf;          % Initialize minimum distance to Inf
    for a = 1:Asize(1)      % Travel set A to find the min(d(b,A))
        tempdist = norm(A(a,:)-B(b,:));
        if tempdist < mindist
            mindist = tempdist;
        end
    end
    rhd = rhd + mindist;    % Sum the reverse distances
end
rhd = rhd/Bsize(1);         % Divide by the total no. to get average

mhd = max(fhd,rhd);         % Find the minimum of fhd/rhd as 
                            % the mod hausdorff dist


end
4

1 回答 1

0

我会尝试这样的事情

D = bsxfun( @minus, permute( A, [3 1 2] ), permute( B, [1 3 2] ) );
D = sqrt(sum( D.^2, 3 )); % all pair-wise distances. 
% I think there is a pdist2 function that can do this computation
% of the distances. 
f = min( D, [], 1);
fhd = mean(f);
r = min( D, [], 2);
rhd = mean(r);
mhd = max( fhd, rhd );

D通过查看 d_ij 的表达式,可以进一步改进计算距离矩阵:

d_ij^2 = ||a_i||^2 + ||b_j||^2 - 2

这意味着 和 之间的唯一交互AB通过 Matlab 知道计算非常有效的点积。

于 2012-12-24T20:41:33.420 回答