8b24fc2947310c1be505658591223330bacc13cd
[scilab.git] / scilab / modules / elementary_functions / macros / %hm_gsort.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyrifht (C) 2012 - Scilab Enterprises - Cedric Delamarre
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function [S, k] = %hm_gsort(A, optsort, directionsort)
14     rhs = argn(2);
15     lhs = argn(1);
16     AisBool = typeof(A)=="boolean"
17     if AisBool
18         A = iconvert(A,1) // int8
19     end
20
21     // arguments by default in gsort
22     select rhs
23     case 1
24         optsort = "g";
25         directionsort = "d";
26     case 2
27         // optsort can be: 'r', 'c', 'g', 'lr', 'lc'
28         pos_opts = find(optsort == ["r", "c", "g", "lr", "lc"]);
29         if pos_opts == [] then
30             error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', ''%s'' or ''%s'' expected.\n"), "gsort", 2, "r", "c", "g", "lr", "lc"));
31         end
32         directionsort = "d";
33     else
34         // optsort can be: 'r', 'c', 'g', 'lr', 'lc'
35         pos_opts = find(optsort == ["r", "c", "g", "lr", "lc"]);
36         // directionsort can be: 'd' or 'i'
37         pos_direction = find(directionsort == ["d", "i"]);
38         if pos_opts == [] then
39             error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', ''%s'' or ''%s'' expected.\n"), "gsort", 2, "r", "c", "g", "lr", "lc"));
40         end
41         if pos_direction == [] then
42             error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'' or ''%s'' expected.\n"), "gsort", 3, "d", "i"));
43         end
44     end
45
46     if(lhs == 1) // without output indices, gsort is faster.
47         if optsort == "g"
48             S = gsort(A(:), optsort, directionsort);
49             S = matrix(S, size(A));
50         else // 'r' 'c' 'lr' 'lc'
51             sizes = size(A);
52
53             // transform input hypermatrix to a hypermatrix of 3 dimensions
54             l = prod(sizes(3:$));
55             mat = matrix(A,sizes(1), sizes(2), l);
56
57             // init output variables
58             S = zeros(sizes(1), sizes(2), l);
59
60             // perform a 2D sort for each dimensions > 2
61             for i = 1:l
62                 S(:,:,i) = gsort(mat(:,:,i), optsort, directionsort);
63             end
64
65             // return the result with the good dimensions
66             S = matrix(S, sizes);
67         end
68     else
69         if optsort == "g"
70             [S, k] = gsort(A(:), optsort, directionsort);
71             S = matrix(S, size(A));
72             k = matrix(k, size(A));
73         else // 'r' 'c' 'lr' 'lc'
74             sizes = size(A);
75             sizesInd = size(A);
76
77             // transform input hypermatrix to a hypermatrix of 3 dimensions
78             l = prod(sizes(3:$));
79             mat = matrix(A,sizes(1), sizes(2), l);
80
81             // init output variables
82             S = zeros(sizes(1), sizes(2), l);
83             if optsort == "lc"
84                 sizesInd(1) = 1;
85             elseif optsort == "lr"
86                 sizesInd(2) = 1;
87             end
88             k = zeros(sizesInd(1), sizesInd(2), l);
89
90             // perform a 2D sort for each dimensions > 2
91             for i = 1:l
92                 [S(:,:,i), k(:,:,i)] = gsort(mat(:,:,i), optsort, directionsort);
93             end
94
95             // return the result with the good dimensions
96             S = matrix(S, sizes);
97             k = matrix(k, sizesInd);
98         end
99     end
100     if AisBool then
101         S = S==int8(1)
102     end
103 endfunction