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;