Mercurial > hg > octave-nkf
diff liboctave/intNDArray.cc @ 6979:2883ea1c5c18
[project @ 2007-10-08 20:23:48 by dbateman]
author | dbateman |
---|---|
date | Mon, 08 Oct 2007 20:26:01 +0000 |
parents | 7e958a1532c6 |
children | 93c65f2a5668 |
line wrap: on
line diff
--- a/liboctave/intNDArray.cc +++ b/liboctave/intNDArray.cc @@ -61,6 +61,68 @@ return false; } + +template <class T> +intNDArray<T> +intNDArray<T>::diag (void) const +{ + return diag (0); +} + +template <class T> +intNDArray<T> +intNDArray<T>::diag (octave_idx_type k) const +{ + dim_vector dv = this->dims (); + octave_idx_type nd = dv.length (); + + if (nd > 2) + { + (*current_liboctave_error_handler) ("Matrix must be 2-dimensional"); + return intNDArray<T>(); + } + else + { + octave_idx_type nnr = dv (0); + octave_idx_type nnc = dv (1); + + if (k > 0) + nnc -= k; + else if (k < 0) + nnr += k; + + intNDArray<T> 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.xelem (i) = this->elem (i, i+k); + } + else if (k < 0) + { + for (octave_idx_type i = 0; i < ndiag; i++) + d.xelem (i) = this->elem (i-k, i); + } + else + { + for (octave_idx_type i = 0; i < ndiag; i++) + d.xelem (i) = this->elem (i, i); + } + } + else + (*current_liboctave_error_handler) + ("diag: requested diagonal out of range"); + + return d; + } +} + // FIXME -- this is not quite the right thing. template <class T>