Mercurial > octave-nkf
diff 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 |
line wrap: on
line diff
--- a/src/Cell.cc Thu Mar 20 17:00:15 2008 +0100 +++ b/src/Cell.cc Thu Mar 20 20:54:19 2008 +0100 @@ -238,6 +238,52 @@ return retval; } +Cell +Cell::diag (void) const +{ + return diag (0); +} + +Cell +Cell::diag (octave_idx_type k) const +{ + octave_idx_type nnr = rows (); + octave_idx_type nnc = cols (); + if (k > 0) + nnc -= k; + else if (k < 0) + nnr += k; + + Cell d; + + if (nnr > 0 && nnc > 0) + { + octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc; + + d.resize (dim_vector (ndiag, 1)); + + if (k > 0) + { + for (octave_idx_type i = 0; i < ndiag; i++) + d.elem (i) = elem (i, i+k); + } + else if (k < 0) + { + for (octave_idx_type i = 0; i < ndiag; i++) + d.elem (i) = elem (i-k, i); + } + else + { + for (octave_idx_type i = 0; i < ndiag; i++) + d.elem (i) = elem (i, i); + } + } + else + error ("diag: requested diagonal out of range"); + + return d; +} + /* ;;; Local Variables: *** ;;; mode: C++ ***