%% Frechet Distance between two curves (3D)%%functionf =frechet3D(P1,P2,varargin)X1=P1(:,1);X2=P2(:,1);Y1=P1(:,2);Y2=P2(:,2);Z1=P1(:,3);Z2=P2(:,3);%get path point lengthL1=length(X1);L2=length(X2);%check vector lengthsifor(L1~=length(Y1),L2~=length(Y2))error('Paired input vectors (Xi,Yi) must be the same length.')end%check for column inputsifor(or(size(X1,1)<=1,size(Y1,1)<=1),or(size(X2,1)<=1,size(Y2,1)<=1))error('Input vectors must be column vectors.')end%create maxtrix formsX1_mat=ones(L2,1)*X1';Y1_mat=ones(L2,1)*Y1';Z1_mat=ones(L2,1)*Z1';X2_mat=X2*ones(1,L1);Y2_mat=Y2*ones(1,L1);Z2_mat=Z2*ones(1,L1);%calculate frechet distance matrixfrechet1=sqrt((X1_mat-X2_mat).^2+(Y1_mat-Y2_mat).^2+(Z1_mat-Z2_mat).^2);fmin=min(frechet1(:));fmax=max(frechet1(:));%handle resolutionif~isempty(varargin)res=varargin{1};ifres<=0error('The resolution parameter must be greater than zero.')elseif((fmax-fmin)/res)>10000warning('Given these two curves, and that resolution, this might take a while.')elseifres>=(fmax-fmin)warning('The resolution is too low given these curves to compute anything meaningful.')f=fmax;returnendelseres=(fmax-fmin)/100;end%compute frechet distanceclearfforq3=fmin:res:fmaxim1=bwlabel(frechet1<=q3);%get region number of beginning and end pointsifand(im1(1,1)~=0,im1(1,1)==im1(end,end))f=q3;breakendendif(~(exist('f')))f=fmax;end% disp(f)return
--------
[1] Fréchet, M. Maurice. "Sur quelques points du calcul fonctionnel."
Rendiconti del Circolo Matematico di Palermo (1884-1940)
22.1 (1906): 1-72.