]> Creatis software - CreaPhase.git/blobdiff - octave_packages/dataframe-0.9.1/@dataframe/sort.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / dataframe-0.9.1 / @dataframe / sort.m
diff --git a/octave_packages/dataframe-0.9.1/@dataframe/sort.m b/octave_packages/dataframe-0.9.1/@dataframe/sort.m
new file mode 100644 (file)
index 0000000..870c229
--- /dev/null
@@ -0,0 +1,151 @@
+function [resu, idx] = sort(df, varargin) 
+  
+  %# -*- texinfo -*-
+  %# @deftypefn  {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x})
+  %# @deftypefnx {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}, @var{dim})
+  %# @deftypefnx {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}, @var{mode})
+  %# @deftypefnx {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}, @var{dim},  @var{mode})
+  %# Return a copy of @var{x} with the elements arranged in increasing
+  %# order.  For matrices, @code{sort} orders the elements in each column.
+  %#
+  %# For example:
+  %# 
+  %# @example
+  %# @group
+  %# sort ([1, 2; 2, 3; 3, 1])
+  %#      @result{}  1  1
+  %#          2  2
+  %#          3  3
+  %# 
+  %# @end group
+  %# @end example
+  %# 
+  %# The @code{sort} function may also be used to produce a matrix
+  %# containing the original row indices of the elements in the sorted
+  %# matrix.  For example:
+  %# 
+  %# @example
+  %# @group
+  %# [s, i] = sort ([1, 2; 2, 3; 3, 1])
+  %#      @result{} s = 1  1
+  %#             2  2
+  %#             3  3
+  %#      @result{} i = 1  3
+  %#             2  1
+  %#             3  2
+  %# @end group
+  %# @end example
+  %# 
+  %# If the optional argument @var{dim} is given, then the matrix is sorted
+  %# along the dimension defined by @var{dim}.  The optional argument @code{mode}
+  %# defines the order in which the values will be sorted.  Valid values of
+  %# @code{mode} are `ascend' or `descend'.
+  %# 
+  %# For equal elements, the indices are such that the equal elements are listed
+  %# in the order that appeared in the original list.
+  %# 
+  %# The @code{sort} function may also be used to sort strings and cell arrays
+  %# of strings, in which case the dictionary order of the strings is used.
+  %# 
+  %# The algorithm used in @code{sort} is optimized for the sorting of partially
+  %# ordered lists.
+  %# @end deftypefn 
+
+  %% Copyright (C) 2009-2012 Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
+  %%
+  %% This file is part of Octave.
+  %%
+  %% Octave is free software; you can redistribute it and/or
+  %% modify it under the terms of the GNU General Public
+  %% License as published by the Free Software Foundation;
+  %% either version 2, or (at your option) any later version.
+  %%
+  %% Octave is distributed in the hope that it will be useful,
+  %% but WITHOUT ANY WARRANTY; without even the implied
+  %% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  %% PURPOSE.  See the GNU General Public License for more
+  %% details.
+  %%
+  %% You should have received a copy of the GNU General Public
+  %% License along with Octave; see the file COPYING.  If not,
+  %% write to the Free Software Foundation, 51 Franklin Street -
+  %% Fifth Floor, Boston, MA 02110-1301, USA.
+
+  %#
+  %# $Id: sort.m 9585 2012-02-05 15:32:46Z cdemills $
+  %#
+
+  if !isa(df, 'dataframe'),
+    resu = []; return;
+  endif
+
+  dim = []; mode = [];
+  vout= varargin;
+
+  indi = 1; while indi <= length(varargin)
+    if isnumeric(varargin{indi}),
+      if !isempty(dim),
+       print_usage('@dataframe/sort');
+       resu = [];
+       return
+      else
+       dim = varargin{indi};
+       if 3 == dim, vout(indi) = 2; endif
+      endif
+    else
+      if !isempty(mode),
+       print_usage('@dataframe/sort');
+       resu = [];
+       return
+      else
+       sort = varargin{indi};
+      endif
+    endif
+    indi = indi + 1;
+  endwhile;
+
+  if isempty(dim), dim = 1; endif;
+
+  %# pre-assignation
+  resu = struct(df); 
+  
+  switch(dim)
+    case {1},
+      for indi = 1:resu._cnt(2),
+       [resu._data{indi}, idx(:, indi, :)] = sort\
+           (resu._data{indi}(:, resu._rep{indi}), varargin{:});
+       resu._data{indi} = squeeze(resu._data{indi});
+       resu._rep{indi} = 1:size(resu._data{indi}, 2);
+      endfor
+      if (all([1 == size(idx, 2) 1 == size(idx, 3)])),
+       if (size(resu._ridx, 1) == resu._cnt(1)),
+         resu._ridx = resu._ridx(idx, :);
+       endif
+       if (!isempty(resu._name{1, 1})),
+         resu._name{1, 1} = resu._name{1, 1}(idx);
+         resu._over{1, 1} = resu._over{1, 1}(idx);
+       endif
+      else
+       %# data where mixed
+       resu._ridx = idx;
+       resu._name{1, 1} = []; resu._over{1, 1} = [];
+      endif
+
+    case {2},
+      error('Operation not implemented');
+    case {3},
+      for indi = 1:resu._cnt(2),
+       [resu._data{1, indi}, idx(:, indi)] = sort(resu._data{1, indi}, vout(:));
+      endfor
+     otherwise
+      error("Invalid dimension %d", dim); 
+  endswitch
+  
+  dummy = dbstack();
+  if (any(strmatch('quantile', {dummy.name}))),
+    resu = df_whole(resu);
+  else
+    resu = dataframe(resu);
+  endif
+
+endfunction