复件 disteusq.m
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:3k
源码类别:

语音合成与识别

开发平台:

Matlab

  1. function d=disteusq(x,y,mode,w)
  2. %DISTEUSQ calculate euclidean, squared euclidean or mahanalobis distance D=(X,Y,MODE,W)
  3. %
  4. % Inputs: X,Y         Vector sets to be compared. Each row contains a data vector.
  5. %                     X and Y must have the same number of columns.
  6. %
  7. %         MODE        Character string selecting the following options:
  8. %                         'x'  Calculate the full distance matrix from every row of X to every row of Y
  9. %                         'd'  Calculate only the distance between corresponding rows of X and Y
  10. %                              The default is 'd' if X and Y have the same number of rows otherwise 'x'.
  11. %                         's'  take the square-root of the result to give the euclidean distance.
  12. %
  13. %         W           Optional weighting matrix: the distance calculated is (x-y)*W*(x-y)'
  14. %                     If W is a vector, then the matrix diag(W) is used.
  15. %           
  16. % Output: D           If MODE='d' then D is a column vector with the same number of rows as the shorter of X and Y.
  17. %                     If MODE='x' then D is a matrix with the same number of rows as X and the same number of columns as Y'.
  18. %
  19. %      Copyright (C) Mike Brookes 1998
  20. %
  21. %      Last modified Fri Jan  7 08:59:48 2000
  22. %
  23. %   VOICEBOX is a MATLAB toolbox for speech processing. Home page is at
  24. %   http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
  25. %
  26. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  27. %   This program is free software; you can redistribute it and/or modify
  28. %   it under the terms of the GNU General Public License as published by
  29. %   the Free Software Foundation; either version 2 of the License, or
  30. %   (at your option) any later version.
  31. %
  32. %   This program is distributed in the hope that it will be useful,
  33. %   but WITHOUT ANY WARRANTY; without even the implied warranty of
  34. %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  35. %   GNU General Public License for more details.
  36. %
  37. %   You can obtain a copy of the GNU General Public License from
  38. %   ftp://prep.ai.mit.edu/pub/gnu/COPYING-2.0 or by writing to
  39. %   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
  40. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  41. [nx,p]=size(x); ny=size(y,1);
  42. if nargin<3 | isempty(mode) mode='0'; end
  43. if any(mode=='d') | (mode~='x' & nx==ny)
  44.    nx=min(nx,ny);
  45.    z=x(1:nx,:)-y(1:nx,:);
  46.    if nargin<4
  47.       d=sum(z.*conj(z),2);
  48.    elseif min(size(w))==1
  49.       wv=w(:).';
  50.       d=sum(z.*wv(ones(size(z,1),1),:).*conj(z),2);
  51.    else
  52.       d=sum(z*w.*conj(z),2);
  53.    end
  54. else
  55.    if p>1
  56.       if nargin<4
  57.          z=permute(x(:,:,ones(1,ny)),[1 3 2])-permute(y(:,:,ones(1,nx)),[3 1 2]);
  58.          d=sum(z.*conj(z),3);
  59.       else
  60.          nxy=nx*ny;
  61.          z=reshape(permute(x(:,:,ones(1,ny)),[1 3 2])-permute(y(:,:,ones(1,nx)),[3 1 2]),nxy,p);
  62.          if min(size(w))==1
  63.             wv=w(:).';
  64.             d=reshape(sum(z.*wv(ones(nxy,1),:).*conj(z),2),nx,ny);
  65.          else
  66.             d=reshape(sum(z*w.*conj(z),2),nx,ny);
  67.          end
  68.       end
  69.    else
  70.       z=x(:,ones(1,ny))-y(:,ones(1,nx)).';
  71.       if nargin<4
  72.          d=z.*conj(z);
  73.       else
  74.          d=w*z.*conj(z);
  75.       end
  76.    end
  77. end
  78. if any(mode=='s')
  79.    d=sqrt(d);
  80. end