Mercurial > octave-nkf
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. |