8cb4fa6f501089f74c5682ff6db740299a6f7160
[scilab.git] / scilab / modules / elementary_functions / macros / flipdim.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA - Farid BELAHCENE
3 // Copyright (C) DIGITEO - 2011 - Allan CORNET
4 // Copyright (C) 2013 - Samuel GOUGEON : restriction to decimal numbers removed
5 //
6 // Copyright (C) 2012 - 2016 - Scilab Enterprises
7 //
8 // This file is hereby licensed under the terms of the GNU GPL v2.0,
9 // pursuant to article 5.3.4 of the CeCILL v.2.1.
10 // This file was originally licensed under the terms of the CeCILL v2.1,
11 // and continues to be available under such terms.
12 // For more information, see the COPYING file which you should have received
13 // along with this program.
14
15 function y = flipdim(x, dim, sb)
16
17     // FLIPDIM function
18     // Given x, a scalar/vector/matrix of any type, two integers dim and sb, this function flips the x components by blocks along the dimension number dim (x and y have the same size).
19     // -Inputs :
20     //  x : a scalar/vector/array
21     //  dim : a positive integer
22     //  sb : size of the block to permute
23     // -Output :
24     //  y : a scalar/vector/array
25     //
26     // F.Belahcene
27
28     rhs = argn(2);
29     if rhs < 2 then
30         msg = _("%s: Wrong number of input argument(s): %d to %d expected.\n");
31         error(msprintf(msg, "flipdim", 2, 3));
32     end
33
34     if size(dim, "*") <> 1 then
35         msg = _("%s: Wrong size for input argument #%d: A positive integer expected.\n")
36         error(msprintf(msg, "flipdim", 2));
37     elseif type(dim) <> 8 & (type(dim) <> 1 | dim < 1 ) then
38         msg = _("%s: Wrong type for input argument #%d: A positive integer expected.\n");
39         error(msprintf(msg, "flipdim", 2));
40     end
41     if rhs >= 3 then
42         if size(sb, "*") <> 1 then
43             msg = _("%s: Wrong size for input argument #%d: A positive integer expected.\n")
44             error(msprintf(msg, "flipdim", 3));
45         elseif type(sb) <> 8 & (type(sb) <> 1 | sb < 1 ) then
46             msg = _("%s: Wrong type for input argument #%d: A positive integer expected.\n");
47             error(msprintf(msg, "flipdim", 3));
48         elseif dim > 2 then
49             msg = _("%s: Cannot flip hypermatrix blockwise. %d input arguments expected.\n");
50             error(msprintf(msg, "flipdim", 2));
51         end
52     else
53         sb = 1;
54     end
55
56     dim = floor(dim);
57     sb  = floor(sb);
58
59     if dim > ndims(x)
60         y = x;
61         return
62     elseif or(dim == [1 2]) & ndims(x) < 3 then  // flipdim(x, dim, sb) is not suited for hypermatrices.
63
64         if dim == 1 then
65             x = x.';
66         end
67
68         nC = size(x, 2);
69         if modulo(nC, sb) ~= 0 then
70             msg = _("%s: Wrong value for input argument #%d: A divisor of the selected dimension size expected.\n");
71             error(msprintf(msg, "flipdim", 3));
72         end
73         nb = nC/sb; // Number of blocks.
74         c2 = ((nb:-1:1).*.ones(1,sb))*sb + ones(1, nb).*.(1-sb:0);
75         y = x(:, c2);
76         if dim == 1 then
77             y = y.';
78         end
79
80     else
81
82         l = list();
83         for k = 1:dim - 1
84             l(k) = eye();
85         end
86         l(dim) = $:-1:1;
87         for k = dim + 1:ndims(x)
88             l(k) = eye();
89         end
90
91         y = x(l(:));
92
93     end
94
95 endfunction