comparison liboctave/intNDArray.cc @ 7620:36594d5bbe13

Move diag function into the octave_value class
author David Bateman <dbateman@free.fr>
date Fri, 21 Mar 2008 00:08:24 +0100
parents 24abf5a702d9
children 008f3985c8c0
comparison
equal deleted inserted replaced
7619:56012914972a 7620:36594d5bbe13
58 } 58 }
59 59
60 return false; 60 return false;
61 } 61 }
62 62
63
64 template <class T>
65 intNDArray<T>
66 intNDArray<T>::diag (void) const
67 {
68 return diag (0);
69 }
70
71 template <class T> 63 template <class T>
72 intNDArray<T> 64 intNDArray<T>
73 intNDArray<T>::diag (octave_idx_type k) const 65 intNDArray<T>::diag (octave_idx_type k) const
74 { 66 {
75 dim_vector dv = this->dims (); 67 return MArrayN<T>::diag (k);
76 octave_idx_type nd = dv.length ();
77
78 if (nd > 2)
79 {
80 (*current_liboctave_error_handler) ("Matrix must be 2-dimensional");
81 return intNDArray<T>();
82 }
83 else
84 {
85 octave_idx_type nnr = dv (0);
86 octave_idx_type nnc = dv (1);
87
88 if (k > 0)
89 nnc -= k;
90 else if (k < 0)
91 nnr += k;
92
93 intNDArray<T> d;
94
95 if (nnr > 0 && nnc > 0)
96 {
97 octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
98
99 d.resize (dim_vector (ndiag, 1));
100
101 if (k > 0)
102 {
103 for (octave_idx_type i = 0; i < ndiag; i++)
104 d.xelem (i) = this->elem (i, i+k);
105 }
106 else if (k < 0)
107 {
108 for (octave_idx_type i = 0; i < ndiag; i++)
109 d.xelem (i) = this->elem (i-k, i);
110 }
111 else
112 {
113 for (octave_idx_type i = 0; i < ndiag; i++)
114 d.xelem (i) = this->elem (i, i);
115 }
116 }
117 else
118 (*current_liboctave_error_handler)
119 ("diag: requested diagonal out of range");
120
121 return d;
122 }
123 } 68 }
124 69
125 // FIXME -- this is not quite the right thing. 70 // FIXME -- this is not quite the right thing.
126 71
127 template <class T> 72 template <class T>