Mercurial > hg > octave-nkf
comparison src/ov-base-mat.cc @ 10366:e5ae13b8b2c2
improve Array indexing error messages
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Sat, 27 Feb 2010 08:37:34 +0100 |
parents | 12884915a8e4 |
children | 4d1fc073fbb7 |
comparison
equal
deleted
inserted
replaced
10365:532802559f39 | 10366:e5ae13b8b2c2 |
---|---|
134 octave_value retval; | 134 octave_value retval; |
135 | 135 |
136 octave_idx_type n_idx = idx.length (); | 136 octave_idx_type n_idx = idx.length (); |
137 | 137 |
138 int nd = matrix.ndims (); | 138 int nd = matrix.ndims (); |
139 const MT& cmatrix = matrix; | |
139 | 140 |
140 switch (n_idx) | 141 switch (n_idx) |
141 { | 142 { |
142 case 0: | 143 case 0: |
143 retval = matrix; | 144 retval = matrix; |
148 idx_vector i = idx (0).index_vector (); | 149 idx_vector i = idx (0).index_vector (); |
149 | 150 |
150 if (! error_state) | 151 if (! error_state) |
151 { | 152 { |
152 // optimize single scalar index. | 153 // optimize single scalar index. |
153 if (i.is_scalar () && i(0) < matrix.numel ()) | 154 if (! resize_ok && i.is_scalar ()) |
154 retval = const_cast<const MT&> (matrix)(i(0)); | 155 retval = cmatrix.checkelem (i(0)); |
155 else | 156 else |
156 retval = MT (matrix.index (i, resize_ok)); | 157 retval = MT (matrix.index (i, resize_ok)); |
157 } | 158 } |
158 } | 159 } |
159 break; | 160 break; |
167 idx_vector j = idx (1).index_vector (); | 168 idx_vector j = idx (1).index_vector (); |
168 | 169 |
169 if (! error_state) | 170 if (! error_state) |
170 { | 171 { |
171 // optimize two scalar indices. | 172 // optimize two scalar indices. |
172 if (i.is_scalar () && j.is_scalar () && nd == 2 | 173 if (! resize_ok && i.is_scalar () && j.is_scalar ()) |
173 && i(0) < matrix.rows () && j(0) < matrix.columns ()) | 174 retval = cmatrix.checkelem (i(0), j(0)); |
174 retval = const_cast<const MT&> (matrix)(i(0), j(0)); | |
175 else | 175 else |
176 retval = MT (matrix.index (i, j, resize_ok)); | 176 retval = MT (matrix.index (i, j, resize_ok)); |
177 } | 177 } |
178 } | 178 } |
179 } | 179 } |
180 break; | 180 break; |
181 | 181 |
182 default: | 182 default: |
183 { | 183 { |
184 Array<idx_vector> idx_vec (n_idx, 1); | 184 Array<idx_vector> idx_vec (n_idx, 1); |
185 bool scalar_opt = n_idx == nd; | 185 bool scalar_opt = n_idx == nd && ! resize_ok; |
186 const dim_vector dv = matrix.dims (); | 186 const dim_vector dv = matrix.dims (); |
187 | 187 |
188 for (octave_idx_type i = 0; i < n_idx; i++) | 188 for (octave_idx_type i = 0; i < n_idx; i++) |
189 { | 189 { |
190 idx_vec(i) = idx(i).index_vector (); | 190 idx_vec(i) = idx(i).index_vector (); |
191 | 191 |
192 if (error_state) | 192 if (error_state) |
193 break; | 193 break; |
194 | 194 |
195 scalar_opt = (scalar_opt && idx_vec(i).is_scalar () | 195 scalar_opt = (scalar_opt && idx_vec(i).is_scalar ()); |
196 && idx_vec(i)(0) < dv(0)); | |
197 } | 196 } |
198 | 197 |
199 if (! error_state) | 198 if (! error_state) |
200 { | 199 { |
201 if (scalar_opt) | 200 if (scalar_opt) |
202 { | 201 retval = cmatrix.checkelem (conv_to_int_array (idx_vec)); |
203 // optimize all scalar indices. Don't construct an index array, | |
204 // but rather calc a scalar index directly. | |
205 octave_idx_type k = 1, j = 0; | |
206 for (octave_idx_type i = 0; i < n_idx; i++) | |
207 { | |
208 j += idx_vec(i)(0) * k; | |
209 k *= dv (i); | |
210 } | |
211 retval = const_cast<const MT&> (matrix)(j); | |
212 } | |
213 else | 202 else |
214 retval = MT (matrix.index (idx_vec, resize_ok)); | 203 retval = MT (matrix.index (idx_vec, resize_ok)); |
215 } | 204 } |
216 } | 205 } |
217 break; | 206 break; |