Mercurial > hg > octave-lyh
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++ *** |