% ISEQUAL test if two matrices are equal to within the given tolerance.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% DESCRIPTION: ISEQUAL test if two matrices are equal to within the given
%              tolerance.
%
% CALL:       result = isequal(m1, m2)
%             result = isequal(m1, m2, tol)
%
% INPUTS:     m1  - a matrix of real or complex values
%             m2  - a matrix of real or complex values
%             tol - the tolerance to test against [default: 1e-14]
%
% OUTPUTS:    result - true or false
%
% VERSION: $Id: isequal.m,v 1.8 2010/11/19 12:40:13 ingo Exp $
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function res = isequal(varargin)
  
  % Check size of the input numbers
  if  ~all(size(varargin{1}) == size(varargin{2}))        || ...
      ~(isnumeric(varargin{1}) || islogical(varargin{1})) || ...
      ~(isnumeric(varargin{2}) || islogical(varargin{2}))
    res = false;
    return
  end
  
  m1 = double(varargin{1});
  m2 = double(varargin{2});
  
  r = m1./m2;
  
  if nargin > 2 && ~isempty(varargin{3})
    tol = varargin{3};
  else
    tol = 1e-14;
  end
  
  maxAbsDiff = abs(max(1-abs(r)));
  minAbsDiff = abs(min(1-abs(r)));
  maxAngleDiff = max(abs(angle(r)));
  minAngleDiff = min(abs(angle(r)));
  
  maxAbsDiff(isnan(maxAbsDiff))=0;
  minAbsDiff(isnan(minAbsDiff))=0;
  maxAngleDiff(isnan(maxAngleDiff))=0;
  minAngleDiff(isnan(minAngleDiff))=0;
  
  if  all([maxAbsDiff < tol,...
      minAbsDiff < tol, ...
      maxAngleDiff < tol, ...
      minAngleDiff < tol])
    
    res = true;
  else
    res = false;
  end
  
end
