* Bug 16155 fixed: flipdim(hypermat,dim,sb) was wrong or disabled
[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) 2012 - 2016 - Scilab Enterprises
5 // Copyright (C) 2013, 2019 - Samuel GOUGEON
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 function y = flipdim(x, dim, sb)
15
16     // FLIPDIM function
17     // Given x, a scalar/vector/matrix of any type, two integers dim and sb, this function flips
18     // 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     // CHECK INPUT ARGUMENTS
29     // =====================
30     rhs = argn(2);
31     if rhs < 2 then
32         msg = _("%s: Wrong number of input argument(s): %d to %d expected.\n");
33         error(msprintf(msg, "flipdim", 2, 3));
34     end
35
36     if size(dim, "*") <> 1 then
37         msg = _("%s: Wrong size for input argument #%d: A scalar expected.\n")
38         error(msprintf(msg, "flipdim", 2));
39     elseif type(dim) <> 8 & (type(dim) <> 1 | dim < 1 ) then
40         msg = _("%s: Wrong type for input argument #%d: A positive integer expected.\n");
41         error(msprintf(msg, "flipdim", 2));
42     elseif dim > ndims(x) then
43         msg = _("%s: Argument #%d: Must be <= %d.\n");
44         error(msprintf(msg, "flipdim", 3, ndims(x)));
45     else
46         dim = floor(dim);
47     end
48     if rhs >= 3 then
49         if size(sb, "*") <> 1 then
50             msg = _("%s: Wrong size for input argument #%d: A scalar expected.\n")
51             error(msprintf(msg, "flipdim", 3));
52         elseif and(type(sb) <> [1 8]) | sb < 1 then
53             msg = _("%s: Wrong value for input argument #%d: A positive integer expected.\n");
54             error(msprintf(msg, "flipdim", 3));
55         elseif modulo(size(x, dim), sb) ~= 0 then
56             msg = _("%s: Wrong value for input argument #%d: A divisor of the selected dimension size expected.\n");
57             error(msprintf(msg, "flipdim", 3));
58         end
59     end
60
61     // PROCESSING
62     // ==========
63     l = list();
64     for k = 1:ndims(x)
65         l(k) = 1:1:$
66     end
67     if rhs>2 then
68         sb  = floor(sb);
69         nb = size(x, dim)/sb; // Number of blocks.
70         l(dim) = ((nb:-1:1).*.ones(1,sb))*sb + ones(1, nb).*.(1-sb:0);
71     else
72         l(dim) = $:-1:1
73     end
74     y = x(l(:));
75 endfunction