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