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