comparison liboctave/oct-norm.cc @ 10350:12884915a8e4

merge MArray classes & improve Array interface
author Jaroslav Hajek <highegg@gmail.com>
date Sat, 23 Jan 2010 21:41:03 +0100
parents fa01c1670b3e
children fd0a3ac60b0e
comparison
equal deleted inserted replaced
10349:d4d13389c957 10350:12884915a8e4
222 res = acc; 222 res = acc;
223 } 223 }
224 224
225 // dense versions 225 // dense versions
226 template <class T, class R, class ACC> 226 template <class T, class R, class ACC>
227 void column_norms (const MArray2<T>& m, MArray<R>& res, ACC acc) 227 void column_norms (const MArray<T>& m, MArray<R>& res, ACC acc)
228 { 228 {
229 res = MArray2<R> (1, m.columns ()); 229 res = MArray<R> (1, m.columns ());
230 for (octave_idx_type j = 0; j < m.columns (); j++) 230 for (octave_idx_type j = 0; j < m.columns (); j++)
231 { 231 {
232 ACC accj = acc; 232 ACC accj = acc;
233 for (octave_idx_type i = 0; i < m.rows (); i++) 233 for (octave_idx_type i = 0; i < m.rows (); i++)
234 accj.accum (m(i, j)); 234 accj.accum (m(i, j));
236 res.xelem (j) = accj; 236 res.xelem (j) = accj;
237 } 237 }
238 } 238 }
239 239
240 template <class T, class R, class ACC> 240 template <class T, class R, class ACC>
241 void row_norms (const MArray2<T>& m, MArray<R>& res, ACC acc) 241 void row_norms (const MArray<T>& m, MArray<R>& res, ACC acc)
242 { 242 {
243 res = MArray2<R> (m.rows (), 1); 243 res = MArray<R> (m.rows (), 1);
244 std::vector<ACC> acci (m.rows (), acc); 244 std::vector<ACC> acci (m.rows (), acc);
245 for (octave_idx_type j = 0; j < m.columns (); j++) 245 for (octave_idx_type j = 0; j < m.columns (); j++)
246 { 246 {
247 for (octave_idx_type i = 0; i < m.rows (); i++) 247 for (octave_idx_type i = 0; i < m.rows (); i++)
248 acci[i].accum (m(i, j)); 248 acci[i].accum (m(i, j));
254 254
255 // sparse versions 255 // sparse versions
256 template <class T, class R, class ACC> 256 template <class T, class R, class ACC>
257 void column_norms (const MSparse<T>& m, MArray<R>& res, ACC acc) 257 void column_norms (const MSparse<T>& m, MArray<R>& res, ACC acc)
258 { 258 {
259 res = MArray2<R> (1, m.columns ()); 259 res = MArray<R> (1, m.columns ());
260 for (octave_idx_type j = 0; j < m.columns (); j++) 260 for (octave_idx_type j = 0; j < m.columns (); j++)
261 { 261 {
262 ACC accj = acc; 262 ACC accj = acc;
263 for (octave_idx_type k = m.cidx (j); k < m.cidx (j+1); k++) 263 for (octave_idx_type k = m.cidx (j); k < m.cidx (j+1); k++)
264 accj.accum (m.data (k)); 264 accj.accum (m.data (k));
268 } 268 }
269 269
270 template <class T, class R, class ACC> 270 template <class T, class R, class ACC>
271 void row_norms (const MSparse<T>& m, MArray<R>& res, ACC acc) 271 void row_norms (const MSparse<T>& m, MArray<R>& res, ACC acc)
272 { 272 {
273 res = MArray2<R> (m.rows (), 1); 273 res = MArray<R> (m.rows (), 1);
274 std::vector<ACC> acci (m.rows (), acc); 274 std::vector<ACC> acci (m.rows (), acc);
275 for (octave_idx_type j = 0; j < m.columns (); j++) 275 for (octave_idx_type j = 0; j < m.columns (); j++)
276 { 276 {
277 for (octave_idx_type k = m.cidx (j); k < m.cidx (j+1); k++) 277 for (octave_idx_type k = m.cidx (j); k < m.cidx (j+1); k++)
278 acci[m.ridx (k)].accum (m.data (k)); 278 acci[m.ridx (k)].accum (m.data (k));
307 FUNC_NAME (v, res, norm_accumulator_mp<R> (p)); \ 307 FUNC_NAME (v, res, norm_accumulator_mp<R> (p)); \
308 return res; \ 308 return res; \
309 } 309 }
310 310
311 DEFINE_DISPATCHER (vector_norm, MArray<T>, R) 311 DEFINE_DISPATCHER (vector_norm, MArray<T>, R)
312 DEFINE_DISPATCHER (vector_norm, MArray2<T>, R) 312 DEFINE_DISPATCHER (column_norms, MArray<T>, MArray<R>)
313 DEFINE_DISPATCHER (column_norms, MArray2<T>, MArray<R>) 313 DEFINE_DISPATCHER (row_norms, MArray<T>, MArray<R>)
314 DEFINE_DISPATCHER (row_norms, MArray2<T>, MArray<R>)
315 DEFINE_DISPATCHER (column_norms, MSparse<T>, MArray<R>) 314 DEFINE_DISPATCHER (column_norms, MSparse<T>, MArray<R>)
316 DEFINE_DISPATCHER (row_norms, MSparse<T>, MArray<R>) 315 DEFINE_DISPATCHER (row_norms, MSparse<T>, MArray<R>)
317 316
318 // The approximate subproblem in Higham's method. Find lambda and mu such that 317 // The approximate subproblem in Higham's method. Find lambda and mu such that
319 // norm ([lambda, mu], p) == 1 and norm (y*lambda + col*mu, p) is maximized. 318 // norm ([lambda, mu], p) == 1 and norm (y*lambda + col*mu, p) is maximized.