c5ad7122e1348fbe0c966282a10d32eac9ed26d3
[scilab.git] / scilab / modules / elementary_functions / macros / %sp_gsort.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) DIGITEO - 2009 - Allan CORNET
3 // Copyrifht (C) 2012 - Scilab Enterprises - Adeline CARNIS
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
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 [A, k] = %sp_gsort(A, optsort, directionsort)
15     rhs = argn(2);
16     lhs = argn(1);
17     // arguments by default in gsort
18     select rhs
19     case 1
20         optsort = "g";
21         directionsort = "d";
22     case 2
23         // optsort can be: 'r', 'c', 'g', 'lr', 'lc'
24         pos_opts = find(optsort == ["r", "c", "g", "lr", "lc"]);
25         if pos_opts == [] then
26             error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', ''%s'' or ''%s'' expected.\n"), "gsort", 2, "r", "c", "g", "lr", "lc"));
27         end
28         directionsort = "d";
29     else
30         // optsort can be: 'r', 'c', 'g', 'lr', 'lc'
31         pos_opts = find(optsort == ["r", "c", "g", "lr", "lc"]);
32         // directionsort can be: 'd' or 'i'
33         pos_direction = find(directionsort == ["d", "i"]);
34         if pos_opts == [] then
35             error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', ''%s'' or ''%s'' expected.\n"), "gsort", 2, "r", "c", "g", "lr", "lc"));
36         end
37         if pos_direction == [] then
38             error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'' or ''%s'' expected.\n"), "gsort", 3, "d", "i"));
39         end
40     end
41
42     [ij, v, mn] = spget(A);
43     if mn(1) <> 1 & mn(2) <> 1 then
44         error(msprintf(_("%s: Wrong size for input argument #%d: sparse vectors expected.\n"), "gsort", 1));
45     end
46
47     if mn(1) == 1 then
48         // if A is a row vector and optsort = 'r', the result is the
49         // first input argument
50         if strcmp(optsort, "r") == 0 |strcmp(optsort, "lr") == 0 | v == [] then
51             A = A;
52             if lhs == 2 then
53                 if strcmp(optsort, "lr") == 0 | ij == [] then
54                     k = 1;
55                 else
56                     k = ij(:,1);
57                     k = k';
58                 end
59             end
60         else
61             dif = mn(2) - length(v);
62             if lhs == 1 then
63                 v = gsort(v', optsort, directionsort);
64             else
65                 [v, k] = gsort(v', optsort, directionsort);
66                 k=ij(k,2)';
67             end
68
69             //Obtain the indices corresponding to positive values of v
70             // and negative value of v
71             // If A is complex, the elements are sorted by magnitude
72             if isreal(A) then
73                 last = find(v<0);
74                 first = find(v>0);
75             else
76                 s = abs(v);
77                 last = find(s<0);
78                 first = find(s>0);
79             end
80
81             // Sort the indices
82             if last == [] & first <> [] then
83                 if strcmp(directionsort, "i")== 0 then
84                     ij(:,2) = first(:) + dif;
85                 else
86                     ij(:,2) = first(:);
87                 end
88             elseif first == [] & last <> [] then
89                 if strcmp(directionsort, "i")== 0 then
90                     ij(:,1) = last(:);
91                 else
92                     ij(:,1) = last(:) + dif;
93                 end
94             else
95                 if strcmp(directionsort, "i")== 0 then
96                     ij(:,2) = [last(:); first(:) + dif];
97                 else
98                     ij(:,2) = [first(:); last(:) + dif];
99                 end
100             end
101             A = sparse(ij,v,mn);
102         end
103     end
104
105     if mn(2) == 1 then
106         // if A is a column vector and optsort = 'c', the result is the
107         // first input argument
108         if strcmp(optsort, "c") == 0 | strcmp(optsort, "lc") == 0 | v == [] then
109             A = A;
110             if lhs == 2 then
111                 if strcmp(optsort, "lc") == 0 | ij == [] then
112                     k = 1;
113                 else
114                     k = ij(:,2);
115                     k = k;
116                 end
117             end
118         else
119
120             dif = mn(1) - length(v);
121             if lhs == 1 then
122                 v = gsort(v, optsort, directionsort);
123             else
124                 [v, k] = gsort(v, optsort, directionsort);
125                 k=ij(k,1);
126             end
127
128             //Obtain the indices corresponding to positive values of v
129             // and negative value of v
130             // If A is complex, the elements are sorted by magnitude
131             if isreal(A) then
132                 last = find(v<0);
133                 first = find(v>0);
134             else
135                 s = abs(v);
136                 last = find(s<0);
137                 first = find(s>0);
138             end
139
140             // sort the indices in terms of directionsort = 'i' or 'd'
141             // if directionsort='i' and v>0, the elements are sorted in the
142             // increasing order, ie [0,..,v] and, conversely, in the decreasing
143             // order the elements are sorted : [v,..,0]
144             // if v<0, the elements are sorted in the increasing order,
145             // ie [v,..,0] and, conversely, in the decreasing order the
146             // elements are sorted : [0,..,v]
147             // And else, if v contains positive and neqative values, the
148             // elements are sorted in the increasing order,ie [v_neg,0,v_pos],
149             // and conversely for the decreasing order.
150             if last == [] & first <> [] then
151                 if strcmp(directionsort, "i") == 0 then
152                     ij(:,1) = first(:) + dif;
153                 else
154                     ij(:,1) = first(:);
155                 end
156             elseif first == [] & last <> [] then
157                 if strcmp(directionsort, "i") == 0 then
158                     ij(:,1) = last(:);
159                 else
160                     ij(:,1) = last(:) + dif;
161                 end
162             else
163                 if strcmp(directionsort, "i") == 0 then
164                     ij(:,1) = [last(:); first(:) + dif];
165                 else
166                     ij(:,1) = [first(:); last(:) + dif];
167                 end
168             end
169             A = sparse(ij, v, mn);
170         end
171     end
172 endfunction