X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fm%2Fspecfun%2Fperms.m;fp=octave_packages%2Fm%2Fspecfun%2Fperms.m;h=44f4707b0b444c5ec65c95c079116a0fc4e41e18;hp=0000000000000000000000000000000000000000;hb=1c0469ada9531828709108a4882a751d2816994a;hpb=63de9f36673d49121015e3695f2c336ea92bc278 diff --git a/octave_packages/m/specfun/perms.m b/octave_packages/m/specfun/perms.m new file mode 100644 index 0000000..44f4707 --- /dev/null +++ b/octave_packages/m/specfun/perms.m @@ -0,0 +1,73 @@ +## Copyright (C) 2001-2012 Paul Kienzle +## Copyright (C) 2009 VZLU Prague +## +## 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 3 of the License, 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, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} perms (@var{v}) +## +## Generate all permutations of @var{v}, one row per permutation. The +## result has size @code{factorial (@var{n}) * @var{n}}, where @var{n} +## is the length of @var{v}. +## +## As an example, @code{perms([1, 2, 3])} returns the matrix +## +## @example +## @group +## 1 2 3 +## 2 1 3 +## 1 3 2 +## 2 3 1 +## 3 1 2 +## 3 2 1 +## @end group +## @end example +## @end deftypefn + +function A = perms (v) + if (nargin != 1) + print_usage (); + endif + v = v(:); + n = length (v); + + if (n == 0) + A = []; + else + A = v(1); + for j = 2:n + B = A; + A = zeros (prod (2:j), n, class (v)); + k = size (B, 1); + idx = 1:k; + for i = j:-1:1 + A(idx,1:i-1) = B(:,1:i-1); + A(idx,i) = v(j); + A(idx,i+1:j) = B(:,i:j-1); + idx += k; + endfor + endfor + endif +endfunction + +%!error perms (); +%!error perms (1, 2); + +%!assert (perms ([1,2,3]), [1,2,3;2,1,3;1,3,2;2,3,1;3,1,2;3,2,1]); +%!assert (perms (1:3), perms ([1,2,3])); + +%!assert (perms (int8([1,2,3])), int8([1,2,3;2,1,3;1,3,2;2,3,1;3,1,2;3,2,1]));