comparison liboctave/Sparse.cc @ 8752:06b9903a029b

fix & clean up complex & sparse sorting
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 16 Feb 2009 10:15:43 +0100
parents 095ae5e0a831
children eb63fbe60fab
comparison
equal deleted inserted replaced
8751:9f7ce4bf7650 8752:06b9903a029b
2072 2072
2073 // Can't use versions of these in Array.cc due to duplication of the 2073 // Can't use versions of these in Array.cc due to duplication of the
2074 // instantiations for Array<double and Sparse<double>, etc 2074 // instantiations for Array<double and Sparse<double>, etc
2075 template <class T> 2075 template <class T>
2076 bool 2076 bool
2077 sparse_ascending_compare (T a, T b) 2077 sparse_ascending_compare (typename ref_param<T>::type a,
2078 typename ref_param<T>::type b)
2078 { 2079 {
2079 return (a < b); 2080 return (a < b);
2080 } 2081 }
2081 2082
2082 template <class T> 2083 template <class T>
2083 bool 2084 bool
2084 sparse_descending_compare (T a, T b) 2085 sparse_descending_compare (typename ref_param<T>::type a,
2086 typename ref_param<T>::type b)
2085 { 2087 {
2086 return (a > b); 2088 return (a > b);
2087 }
2088
2089 template <class T>
2090 bool
2091 sparse_ascending_compare (vec_index<T> *a, vec_index<T> *b)
2092 {
2093 return (a->vec < b->vec);
2094 }
2095
2096 template <class T>
2097 bool
2098 sparse_descending_compare (vec_index<T> *a, vec_index<T> *b)
2099 {
2100 return (a->vec > b->vec);
2101 } 2089 }
2102 2090
2103 template <class T> 2091 template <class T>
2104 Sparse<T> 2092 Sparse<T>
2105 Sparse<T>::sort (octave_idx_type dim, sortmode mode) const 2093 Sparse<T>::sort (octave_idx_type dim, sortmode mode) const
2120 } 2108 }
2121 2109
2122 octave_sort<T> lsort; 2110 octave_sort<T> lsort;
2123 2111
2124 if (mode == ASCENDING) 2112 if (mode == ASCENDING)
2125 lsort.set_compare (sparse_ascending_compare); 2113 lsort.set_compare (sparse_ascending_compare<T>);
2126 else if (mode == DESCENDING) 2114 else if (mode == DESCENDING)
2127 lsort.set_compare (sparse_descending_compare); 2115 lsort.set_compare (sparse_descending_compare<T>);
2128 else 2116 else
2129 abort (); 2117 abort ();
2130 2118
2131 T *v = m.data (); 2119 T *v = m.data ();
2132 octave_idx_type *mcidx = m.cidx (); 2120 octave_idx_type *mcidx = m.cidx ();
2139 2127
2140 octave_idx_type i; 2128 octave_idx_type i;
2141 if (mode == ASCENDING) 2129 if (mode == ASCENDING)
2142 { 2130 {
2143 for (i = 0; i < ns; i++) 2131 for (i = 0; i < ns; i++)
2144 if (sparse_ascending_compare (static_cast<T> (0), v [i])) 2132 if (sparse_ascending_compare<T> (static_cast<T> (0), v [i]))
2145 break; 2133 break;
2146 } 2134 }
2147 else 2135 else
2148 { 2136 {
2149 for (i = 0; i < ns; i++) 2137 for (i = 0; i < ns; i++)
2150 if (sparse_descending_compare (static_cast<T> (0), v [i])) 2138 if (sparse_descending_compare<T> (static_cast<T> (0), v [i]))
2151 break; 2139 break;
2152 } 2140 }
2153 for (octave_idx_type k = 0; k < i; k++) 2141 for (octave_idx_type k = 0; k < i; k++)
2154 mridx [k] = k; 2142 mridx [k] = k;
2155 for (octave_idx_type k = i; k < ns; k++) 2143 for (octave_idx_type k = i; k < ns; k++)
2186 m = m.transpose (); 2174 m = m.transpose ();
2187 nr = m.rows (); 2175 nr = m.rows ();
2188 nc = m.columns (); 2176 nc = m.columns ();
2189 } 2177 }
2190 2178
2191 octave_sort<vec_index<T> *> indexed_sort; 2179 octave_sort<T> indexed_sort;
2192 2180
2193 if (mode == ASCENDING) 2181 if (mode == ASCENDING)
2194 indexed_sort.set_compare (sparse_ascending_compare); 2182 indexed_sort.set_compare (sparse_ascending_compare<T>);
2195 else if (mode == DESCENDING) 2183 else if (mode == DESCENDING)
2196 indexed_sort.set_compare (sparse_descending_compare); 2184 indexed_sort.set_compare (sparse_descending_compare<T>);
2197 else 2185 else
2198 abort (); 2186 abort ();
2199 2187
2200 T *v = m.data (); 2188 T *v = m.data ();
2201 octave_idx_type *mcidx = m.cidx (); 2189 octave_idx_type *mcidx = m.cidx ();
2202 octave_idx_type *mridx = m.ridx (); 2190 octave_idx_type *mridx = m.ridx ();
2203 2191
2204 OCTAVE_LOCAL_BUFFER (vec_index<T> *, vi, nr);
2205 OCTAVE_LOCAL_BUFFER (vec_index<T>, vix, nr);
2206
2207 for (octave_idx_type i = 0; i < nr; i++)
2208 vi[i] = &vix[i];
2209
2210 sidx = Array<octave_idx_type> (dim_vector (nr, nc)); 2192 sidx = Array<octave_idx_type> (dim_vector (nr, nc));
2193 OCTAVE_LOCAL_BUFFER (octave_idx_type, vi, nr);
2211 2194
2212 for (octave_idx_type j = 0; j < nc; j++) 2195 for (octave_idx_type j = 0; j < nc; j++)
2213 { 2196 {
2214 octave_idx_type ns = mcidx [j + 1] - mcidx [j]; 2197 octave_idx_type ns = mcidx [j + 1] - mcidx [j];
2215 octave_idx_type offset = j * nr; 2198 octave_idx_type offset = j * nr;
2220 sidx (offset + k) = k; 2203 sidx (offset + k) = k;
2221 } 2204 }
2222 else 2205 else
2223 { 2206 {
2224 for (octave_idx_type i = 0; i < ns; i++) 2207 for (octave_idx_type i = 0; i < ns; i++)
2225 { 2208 vi[i] = mridx[i];
2226 vi[i]->vec = v[i]; 2209
2227 vi[i]->indx = mridx[i]; 2210 indexed_sort.sort (v, vi, ns);
2228 }
2229
2230 indexed_sort.sort (vi, ns);
2231 2211
2232 octave_idx_type i; 2212 octave_idx_type i;
2233 if (mode == ASCENDING) 2213 if (mode == ASCENDING)
2234 { 2214 {
2235 for (i = 0; i < ns; i++) 2215 for (i = 0; i < ns; i++)
2236 if (sparse_ascending_compare (static_cast<T> (0), 2216 if (sparse_ascending_compare<T> (static_cast<T> (0), v[i]))
2237 vi [i] -> vec))
2238 break; 2217 break;
2239 } 2218 }
2240 else 2219 else
2241 { 2220 {
2242 for (i = 0; i < ns; i++) 2221 for (i = 0; i < ns; i++)
2243 if (sparse_descending_compare (static_cast<T> (0), 2222 if (sparse_descending_compare<T> (static_cast<T> (0), v[i]))
2244 vi [i] -> vec))
2245 break; 2223 break;
2246 } 2224 }
2247 2225
2248 octave_idx_type ii = 0; 2226 octave_idx_type ii = 0;
2249 octave_idx_type jj = i; 2227 octave_idx_type jj = i;
2255 sidx (offset + jj++) = k; 2233 sidx (offset + jj++) = k;
2256 } 2234 }
2257 2235
2258 for (octave_idx_type k = 0; k < i; k++) 2236 for (octave_idx_type k = 0; k < i; k++)
2259 { 2237 {
2260 v [k] = vi [k] -> vec; 2238 sidx (k + offset) = vi [k];
2261 sidx (k + offset) = vi [k] -> indx;
2262 mridx [k] = k; 2239 mridx [k] = k;
2263 } 2240 }
2264 2241
2265 for (octave_idx_type k = i; k < ns; k++) 2242 for (octave_idx_type k = i; k < ns; k++)
2266 { 2243 {
2267 v [k] = vi [k] -> vec; 2244 sidx (k - ns + nr + offset) = vi [k];
2268 sidx (k - ns + nr + offset) = vi [k] -> indx;
2269 mridx [k] = k - ns + nr; 2245 mridx [k] = k - ns + nr;
2270 } 2246 }
2271 2247
2272 v += ns; 2248 v += ns;
2273 mridx += ns; 2249 mridx += ns;