comparison src/Cell.cc @ 7618:3209a584e1ac

Further type preservation tests and fix of diag for cell arrays
author David Bateman <dbateman@free.fr>
date Thu, 20 Mar 2008 20:54:19 +0100
parents bb0f2353cff5
children 36594d5bbe13
comparison
equal deleted inserted replaced
7617:9dca8b03dfe8 7618:3209a584e1ac
234 234
235 for (octave_idx_type i = 0; i < numel (); i++) 235 for (octave_idx_type i = 0; i < numel (); i++)
236 r[i] = ((p++)->*fcn) (); 236 r[i] = ((p++)->*fcn) ();
237 237
238 return retval; 238 return retval;
239 }
240
241 Cell
242 Cell::diag (void) const
243 {
244 return diag (0);
245 }
246
247 Cell
248 Cell::diag (octave_idx_type k) const
249 {
250 octave_idx_type nnr = rows ();
251 octave_idx_type nnc = cols ();
252 if (k > 0)
253 nnc -= k;
254 else if (k < 0)
255 nnr += k;
256
257 Cell d;
258
259 if (nnr > 0 && nnc > 0)
260 {
261 octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
262
263 d.resize (dim_vector (ndiag, 1));
264
265 if (k > 0)
266 {
267 for (octave_idx_type i = 0; i < ndiag; i++)
268 d.elem (i) = elem (i, i+k);
269 }
270 else if (k < 0)
271 {
272 for (octave_idx_type i = 0; i < ndiag; i++)
273 d.elem (i) = elem (i-k, i);
274 }
275 else
276 {
277 for (octave_idx_type i = 0; i < ndiag; i++)
278 d.elem (i) = elem (i, i);
279 }
280 }
281 else
282 error ("diag: requested diagonal out of range");
283
284 return d;
239 } 285 }
240 286
241 /* 287 /*
242 ;;; Local Variables: *** 288 ;;; Local Variables: ***
243 ;;; mode: C++ *** 289 ;;; mode: C++ ***