Chris@49
|
1 // Copyright (C) 2011-2012 Ryan Curtin
|
Chris@49
|
2 // Copyright (C) 2011 Matthew Amidon
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup SpCol
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 //! construct an empty column vector
|
Chris@49
|
14 template<typename eT>
|
Chris@49
|
15 inline
|
Chris@49
|
16 SpCol<eT>::SpCol()
|
Chris@49
|
17 : SpMat<eT>(0, 1)
|
Chris@49
|
18 {
|
Chris@49
|
19 arma_extra_debug_sigprint();
|
Chris@49
|
20
|
Chris@49
|
21 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
22 }
|
Chris@49
|
23
|
Chris@49
|
24
|
Chris@49
|
25
|
Chris@49
|
26 //! construct a column vector with the specified number of elements
|
Chris@49
|
27 template<typename eT>
|
Chris@49
|
28 inline
|
Chris@49
|
29 SpCol<eT>::SpCol(const uword in_n_elem)
|
Chris@49
|
30 : SpMat<eT>(in_n_elem, 1)
|
Chris@49
|
31 {
|
Chris@49
|
32 arma_extra_debug_sigprint();
|
Chris@49
|
33
|
Chris@49
|
34 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
35 }
|
Chris@49
|
36
|
Chris@49
|
37
|
Chris@49
|
38
|
Chris@49
|
39 template<typename eT>
|
Chris@49
|
40 inline
|
Chris@49
|
41 SpCol<eT>::SpCol(const uword in_n_rows, const uword in_n_cols)
|
Chris@49
|
42 : SpMat<eT>(in_n_rows, in_n_cols)
|
Chris@49
|
43 {
|
Chris@49
|
44 arma_extra_debug_sigprint();
|
Chris@49
|
45
|
Chris@49
|
46 arma_debug_check((in_n_cols != 1), "SpCol::SpCol(): must have only one column");
|
Chris@49
|
47
|
Chris@49
|
48 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
49 }
|
Chris@49
|
50
|
Chris@49
|
51
|
Chris@49
|
52
|
Chris@49
|
53 //! construct a column vector from specified text
|
Chris@49
|
54 template<typename eT>
|
Chris@49
|
55 inline
|
Chris@49
|
56 SpCol<eT>::SpCol(const char* text)
|
Chris@49
|
57 : SpMat<eT>(text)
|
Chris@49
|
58 {
|
Chris@49
|
59 arma_extra_debug_sigprint();
|
Chris@49
|
60
|
Chris@49
|
61 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
62
|
Chris@49
|
63 arma_debug_check((SpMat<eT>::n_cols != 1), "SpCol::SpCol(): must have only one column");
|
Chris@49
|
64 }
|
Chris@49
|
65
|
Chris@49
|
66
|
Chris@49
|
67
|
Chris@49
|
68 //! construct a column vector from specified text
|
Chris@49
|
69 template<typename eT>
|
Chris@49
|
70 inline
|
Chris@49
|
71 const SpCol<eT>&
|
Chris@49
|
72 SpCol<eT>::operator=(const char* text)
|
Chris@49
|
73 {
|
Chris@49
|
74 arma_extra_debug_sigprint();
|
Chris@49
|
75
|
Chris@49
|
76 SpMat<eT>::init(std::string(text));
|
Chris@49
|
77
|
Chris@49
|
78 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
79
|
Chris@49
|
80 return *this;
|
Chris@49
|
81 }
|
Chris@49
|
82
|
Chris@49
|
83
|
Chris@49
|
84
|
Chris@49
|
85 //! construct a column vector from specified text
|
Chris@49
|
86 template<typename eT>
|
Chris@49
|
87 inline
|
Chris@49
|
88 SpCol<eT>::SpCol(const std::string& text)
|
Chris@49
|
89 : SpMat<eT>(text)
|
Chris@49
|
90 {
|
Chris@49
|
91 arma_extra_debug_sigprint();
|
Chris@49
|
92
|
Chris@49
|
93 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
94
|
Chris@49
|
95 arma_debug_check((SpMat<eT>::n_cols != 1), "SpCol::SpCol(): must have only one column");
|
Chris@49
|
96 }
|
Chris@49
|
97
|
Chris@49
|
98
|
Chris@49
|
99
|
Chris@49
|
100 //! construct a column vector from specified text
|
Chris@49
|
101 template<typename eT>
|
Chris@49
|
102 inline
|
Chris@49
|
103 const SpCol<eT>&
|
Chris@49
|
104 SpCol<eT>::operator=(const std::string& text)
|
Chris@49
|
105 {
|
Chris@49
|
106 arma_extra_debug_sigprint();
|
Chris@49
|
107
|
Chris@49
|
108 SpMat<eT>::init(std::string(text));
|
Chris@49
|
109
|
Chris@49
|
110 return *this;
|
Chris@49
|
111 }
|
Chris@49
|
112
|
Chris@49
|
113
|
Chris@49
|
114
|
Chris@49
|
115 template<typename eT>
|
Chris@49
|
116 inline
|
Chris@49
|
117 const SpCol<eT>&
|
Chris@49
|
118 SpCol<eT>::operator=(const eT val)
|
Chris@49
|
119 {
|
Chris@49
|
120 arma_extra_debug_sigprint();
|
Chris@49
|
121
|
Chris@49
|
122 SpMat<eT>::operator=(val);
|
Chris@49
|
123
|
Chris@49
|
124 return *this;
|
Chris@49
|
125 }
|
Chris@49
|
126
|
Chris@49
|
127
|
Chris@49
|
128
|
Chris@49
|
129 template<typename eT>
|
Chris@49
|
130 template<typename T1>
|
Chris@49
|
131 inline
|
Chris@49
|
132 SpCol<eT>::SpCol(const Base<eT,T1>& X)
|
Chris@49
|
133 {
|
Chris@49
|
134 arma_extra_debug_sigprint();
|
Chris@49
|
135
|
Chris@49
|
136 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
137
|
Chris@49
|
138 SpMat<eT>::operator=(X.get_ref());
|
Chris@49
|
139 }
|
Chris@49
|
140
|
Chris@49
|
141
|
Chris@49
|
142
|
Chris@49
|
143 template<typename eT>
|
Chris@49
|
144 template<typename T1>
|
Chris@49
|
145 inline
|
Chris@49
|
146 const SpCol<eT>&
|
Chris@49
|
147 SpCol<eT>::operator=(const Base<eT,T1>& X)
|
Chris@49
|
148 {
|
Chris@49
|
149 arma_extra_debug_sigprint();
|
Chris@49
|
150
|
Chris@49
|
151 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
152
|
Chris@49
|
153 SpMat<eT>::operator=(X.get_ref());
|
Chris@49
|
154
|
Chris@49
|
155 return *this;
|
Chris@49
|
156 }
|
Chris@49
|
157
|
Chris@49
|
158
|
Chris@49
|
159
|
Chris@49
|
160 template<typename eT>
|
Chris@49
|
161 template<typename T1>
|
Chris@49
|
162 inline
|
Chris@49
|
163 SpCol<eT>::SpCol(const SpBase<eT,T1>& X)
|
Chris@49
|
164 {
|
Chris@49
|
165 arma_extra_debug_sigprint();
|
Chris@49
|
166
|
Chris@49
|
167 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
168
|
Chris@49
|
169 SpMat<eT>::operator=(X.get_ref());
|
Chris@49
|
170 }
|
Chris@49
|
171
|
Chris@49
|
172
|
Chris@49
|
173
|
Chris@49
|
174 template<typename eT>
|
Chris@49
|
175 template<typename T1>
|
Chris@49
|
176 inline
|
Chris@49
|
177 const SpCol<eT>&
|
Chris@49
|
178 SpCol<eT>::operator=(const SpBase<eT,T1>& X)
|
Chris@49
|
179 {
|
Chris@49
|
180 arma_extra_debug_sigprint();
|
Chris@49
|
181
|
Chris@49
|
182 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
183
|
Chris@49
|
184 SpMat<eT>::operator=(X.get_ref());
|
Chris@49
|
185
|
Chris@49
|
186 return *this;
|
Chris@49
|
187 }
|
Chris@49
|
188
|
Chris@49
|
189
|
Chris@49
|
190
|
Chris@49
|
191 template<typename eT>
|
Chris@49
|
192 template<typename T1, typename T2>
|
Chris@49
|
193 inline
|
Chris@49
|
194 SpCol<eT>::SpCol
|
Chris@49
|
195 (
|
Chris@49
|
196 const SpBase<typename SpCol<eT>::pod_type, T1>& A,
|
Chris@49
|
197 const SpBase<typename SpCol<eT>::pod_type, T2>& B
|
Chris@49
|
198 )
|
Chris@49
|
199 {
|
Chris@49
|
200 arma_extra_debug_sigprint();
|
Chris@49
|
201
|
Chris@49
|
202 access::rw(SpMat<eT>::vec_state) = 1;
|
Chris@49
|
203
|
Chris@49
|
204 SpMat<eT>::init(A,B);
|
Chris@49
|
205 }
|
Chris@49
|
206
|
Chris@49
|
207
|
Chris@49
|
208
|
Chris@49
|
209 template<typename eT>
|
Chris@49
|
210 inline
|
Chris@49
|
211 SpValProxy< SpMat<eT> >
|
Chris@49
|
212 SpCol<eT>::row(const uword row_num)
|
Chris@49
|
213 {
|
Chris@49
|
214 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "SpCol::row(): out of bounds" );
|
Chris@49
|
215
|
Chris@49
|
216 return SpMat<eT>::at(row_num, 0);
|
Chris@49
|
217 }
|
Chris@49
|
218
|
Chris@49
|
219
|
Chris@49
|
220
|
Chris@49
|
221 template<typename eT>
|
Chris@49
|
222 inline
|
Chris@49
|
223 eT
|
Chris@49
|
224 SpCol<eT>::row(const uword row_num) const
|
Chris@49
|
225 {
|
Chris@49
|
226 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "SpCol::row(): out of bounds" );
|
Chris@49
|
227
|
Chris@49
|
228 return SpMat<eT>::at(row_num, 0);
|
Chris@49
|
229 }
|
Chris@49
|
230
|
Chris@49
|
231
|
Chris@49
|
232 /*
|
Chris@49
|
233 template<typename eT>
|
Chris@49
|
234 arma_inline
|
Chris@49
|
235 subview_col<eT>
|
Chris@49
|
236 SpCol<eT>::rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
237 {
|
Chris@49
|
238 arma_extra_debug_sigprint();
|
Chris@49
|
239
|
Chris@49
|
240 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used");
|
Chris@49
|
241
|
Chris@49
|
242 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
243
|
Chris@49
|
244 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
245 }
|
Chris@49
|
246
|
Chris@49
|
247
|
Chris@49
|
248
|
Chris@49
|
249 template<typename eT>
|
Chris@49
|
250 arma_inline
|
Chris@49
|
251 const subview_col<eT>
|
Chris@49
|
252 SpCol<eT>::rows(const uword in_row1, const uword in_row2) const
|
Chris@49
|
253 {
|
Chris@49
|
254 arma_extra_debug_sigprint();
|
Chris@49
|
255
|
Chris@49
|
256 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used");
|
Chris@49
|
257
|
Chris@49
|
258 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
259
|
Chris@49
|
260 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
261 }
|
Chris@49
|
262
|
Chris@49
|
263
|
Chris@49
|
264
|
Chris@49
|
265 template<typename eT>
|
Chris@49
|
266 arma_inline
|
Chris@49
|
267 subview_col<eT>
|
Chris@49
|
268 SpCol<eT>::subvec(const uword in_row1, const uword in_row2)
|
Chris@49
|
269 {
|
Chris@49
|
270 arma_extra_debug_sigprint();
|
Chris@49
|
271
|
Chris@49
|
272 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
273
|
Chris@49
|
274 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
275
|
Chris@49
|
276 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
277 }
|
Chris@49
|
278
|
Chris@49
|
279
|
Chris@49
|
280
|
Chris@49
|
281 template<typename eT>
|
Chris@49
|
282 arma_inline
|
Chris@49
|
283 const subview_col<eT>
|
Chris@49
|
284 SpCol<eT>::subvec(const uword in_row1, const uword in_row2) const
|
Chris@49
|
285 {
|
Chris@49
|
286 arma_extra_debug_sigprint();
|
Chris@49
|
287
|
Chris@49
|
288 arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
289
|
Chris@49
|
290 const uword subview_n_rows = in_row2 - in_row1 + 1;
|
Chris@49
|
291
|
Chris@49
|
292 return subview_col<eT>(*this, 0, in_row1, subview_n_rows);
|
Chris@49
|
293 }
|
Chris@49
|
294
|
Chris@49
|
295
|
Chris@49
|
296
|
Chris@49
|
297 template<typename eT>
|
Chris@49
|
298 arma_inline
|
Chris@49
|
299 subview_col<eT>
|
Chris@49
|
300 SpCol<eT>::subvec(const span& row_span)
|
Chris@49
|
301 {
|
Chris@49
|
302 arma_extra_debug_sigprint();
|
Chris@49
|
303
|
Chris@49
|
304 const bool row_all = row_span.whole;
|
Chris@49
|
305
|
Chris@49
|
306 const uword local_n_rows = SpMat<eT>::n_rows;
|
Chris@49
|
307
|
Chris@49
|
308 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
309 const uword in_row2 = row_span.b;
|
Chris@49
|
310 const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
311
|
Chris@49
|
312 arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
313
|
Chris@49
|
314 return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);
|
Chris@49
|
315 }
|
Chris@49
|
316
|
Chris@49
|
317
|
Chris@49
|
318
|
Chris@49
|
319 template<typename eT>
|
Chris@49
|
320 arma_inline
|
Chris@49
|
321 const subview_col<eT>
|
Chris@49
|
322 SpCol<eT>::subvec(const span& row_span) const
|
Chris@49
|
323 {
|
Chris@49
|
324 arma_extra_debug_sigprint();
|
Chris@49
|
325
|
Chris@49
|
326 const bool row_all = row_span.whole;
|
Chris@49
|
327
|
Chris@49
|
328 const uword local_n_rows = SpMat<eT>::n_rows;
|
Chris@49
|
329
|
Chris@49
|
330 const uword in_row1 = row_all ? 0 : row_span.a;
|
Chris@49
|
331 const uword in_row2 = row_span.b;
|
Chris@49
|
332 const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
|
Chris@49
|
333
|
Chris@49
|
334 arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used");
|
Chris@49
|
335
|
Chris@49
|
336 return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);
|
Chris@49
|
337 }
|
Chris@49
|
338 */
|
Chris@49
|
339
|
Chris@49
|
340
|
Chris@49
|
341 //! remove specified row
|
Chris@49
|
342 template<typename eT>
|
Chris@49
|
343 inline
|
Chris@49
|
344 void
|
Chris@49
|
345 SpCol<eT>::shed_row(const uword row_num)
|
Chris@49
|
346 {
|
Chris@49
|
347 arma_extra_debug_sigprint();
|
Chris@49
|
348
|
Chris@49
|
349 arma_debug_check( row_num >= SpMat<eT>::n_rows, "SpCol::shed_row(): out of bounds");
|
Chris@49
|
350
|
Chris@49
|
351 shed_rows(row_num, row_num);
|
Chris@49
|
352 }
|
Chris@49
|
353
|
Chris@49
|
354
|
Chris@49
|
355
|
Chris@49
|
356 //! remove specified rows
|
Chris@49
|
357 template<typename eT>
|
Chris@49
|
358 inline
|
Chris@49
|
359 void
|
Chris@49
|
360 SpCol<eT>::shed_rows(const uword in_row1, const uword in_row2)
|
Chris@49
|
361 {
|
Chris@49
|
362 arma_extra_debug_sigprint();
|
Chris@49
|
363
|
Chris@49
|
364 arma_debug_check
|
Chris@49
|
365 (
|
Chris@49
|
366 (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows),
|
Chris@49
|
367 "SpCol::shed_rows(): indices out of bounds or incorrectly used"
|
Chris@49
|
368 );
|
Chris@49
|
369
|
Chris@49
|
370 const uword diff = (in_row2 - in_row1 + 1);
|
Chris@49
|
371
|
Chris@49
|
372 // This is easy because everything is in one column.
|
Chris@49
|
373 uword start = 0, end = 0;
|
Chris@49
|
374 bool start_found = false, end_found = false;
|
Chris@49
|
375 for(uword i = 0; i < SpMat<eT>::n_nonzero; ++i)
|
Chris@49
|
376 {
|
Chris@49
|
377 // Start position found?
|
Chris@49
|
378 if (SpMat<eT>::row_indices[i] >= in_row1 && !start_found)
|
Chris@49
|
379 {
|
Chris@49
|
380 start = i;
|
Chris@49
|
381 start_found = true;
|
Chris@49
|
382 }
|
Chris@49
|
383
|
Chris@49
|
384 // End position found?
|
Chris@49
|
385 if (SpMat<eT>::row_indices[i] > in_row2)
|
Chris@49
|
386 {
|
Chris@49
|
387 end = i;
|
Chris@49
|
388 end_found = true;
|
Chris@49
|
389 break;
|
Chris@49
|
390 }
|
Chris@49
|
391 }
|
Chris@49
|
392
|
Chris@49
|
393 if (!end_found)
|
Chris@49
|
394 {
|
Chris@49
|
395 end = SpMat<eT>::n_nonzero;
|
Chris@49
|
396 }
|
Chris@49
|
397
|
Chris@49
|
398 // Now we can make the copy.
|
Chris@49
|
399 if (start != end)
|
Chris@49
|
400 {
|
Chris@49
|
401 const uword elem_diff = end - start;
|
Chris@49
|
402
|
Chris@49
|
403 eT* new_values = memory::acquire_chunked<eT> (SpMat<eT>::n_nonzero - elem_diff);
|
Chris@49
|
404 uword* new_row_indices = memory::acquire_chunked<uword>(SpMat<eT>::n_nonzero - elem_diff);
|
Chris@49
|
405
|
Chris@49
|
406 // Copy before the section we are dropping (if it exists).
|
Chris@49
|
407 if (start > 0)
|
Chris@49
|
408 {
|
Chris@49
|
409 arrayops::copy(new_values, SpMat<eT>::values, start);
|
Chris@49
|
410 arrayops::copy(new_row_indices, SpMat<eT>::row_indices, start);
|
Chris@49
|
411 }
|
Chris@49
|
412
|
Chris@49
|
413 // Copy after the section we are dropping (if it exists).
|
Chris@49
|
414 if (end != SpMat<eT>::n_nonzero)
|
Chris@49
|
415 {
|
Chris@49
|
416 arrayops::copy(new_values + start, SpMat<eT>::values + end, (SpMat<eT>::n_nonzero - end));
|
Chris@49
|
417 arrayops::copy(new_row_indices + start, SpMat<eT>::row_indices + end, (SpMat<eT>::n_nonzero - end));
|
Chris@49
|
418 arrayops::inplace_minus(new_row_indices + start, diff, (SpMat<eT>::n_nonzero - end));
|
Chris@49
|
419 }
|
Chris@49
|
420
|
Chris@49
|
421 memory::release(SpMat<eT>::values);
|
Chris@49
|
422 memory::release(SpMat<eT>::row_indices);
|
Chris@49
|
423
|
Chris@49
|
424 access::rw(SpMat<eT>::values) = new_values;
|
Chris@49
|
425 access::rw(SpMat<eT>::row_indices) = new_row_indices;
|
Chris@49
|
426
|
Chris@49
|
427 access::rw(SpMat<eT>::n_nonzero) -= elem_diff;
|
Chris@49
|
428 access::rw(SpMat<eT>::col_ptrs[1]) -= elem_diff;
|
Chris@49
|
429 }
|
Chris@49
|
430
|
Chris@49
|
431 access::rw(SpMat<eT>::n_rows) -= diff;
|
Chris@49
|
432 access::rw(SpMat<eT>::n_elem) -= diff;
|
Chris@49
|
433
|
Chris@49
|
434 }
|
Chris@49
|
435
|
Chris@49
|
436
|
Chris@49
|
437
|
Chris@49
|
438 // //! insert N rows at the specified row position,
|
Chris@49
|
439 // //! optionally setting the elements of the inserted rows to zero
|
Chris@49
|
440 // template<typename eT>
|
Chris@49
|
441 // inline
|
Chris@49
|
442 // void
|
Chris@49
|
443 // SpCol<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)
|
Chris@49
|
444 // {
|
Chris@49
|
445 // arma_extra_debug_sigprint();
|
Chris@49
|
446 //
|
Chris@49
|
447 // arma_debug_check(set_to_zero == false, "SpCol::insert_rows(): cannot set nonzero values");
|
Chris@49
|
448 //
|
Chris@49
|
449 // arma_debug_check((row_num > SpMat<eT>::n_rows), "SpCol::insert_rows(): out of bounds");
|
Chris@49
|
450 //
|
Chris@49
|
451 // for(uword row = 0; row < SpMat<eT>::n_rows; ++row)
|
Chris@49
|
452 // {
|
Chris@49
|
453 // if (SpMat<eT>::row_indices[row] >= row_num)
|
Chris@49
|
454 // {
|
Chris@49
|
455 // access::rw(SpMat<eT>::row_indices[row]) += N;
|
Chris@49
|
456 // }
|
Chris@49
|
457 // }
|
Chris@49
|
458 //
|
Chris@49
|
459 // access::rw(SpMat<eT>::n_rows) += N;
|
Chris@49
|
460 // access::rw(SpMat<eT>::n_elem) += N;
|
Chris@49
|
461 // }
|
Chris@49
|
462 //
|
Chris@49
|
463 //
|
Chris@49
|
464 //
|
Chris@49
|
465 // //! insert the given object at the specified row position;
|
Chris@49
|
466 // //! the given object must have one column
|
Chris@49
|
467 // template<typename eT>
|
Chris@49
|
468 // template<typename T1>
|
Chris@49
|
469 // inline
|
Chris@49
|
470 // void
|
Chris@49
|
471 // SpCol<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)
|
Chris@49
|
472 // {
|
Chris@49
|
473 // arma_extra_debug_sigprint();
|
Chris@49
|
474 //
|
Chris@49
|
475 // SpMat<eT>::insert_rows(row_num, X);
|
Chris@49
|
476 // }
|
Chris@49
|
477
|
Chris@49
|
478
|
Chris@49
|
479
|
Chris@49
|
480 template<typename eT>
|
Chris@49
|
481 inline
|
Chris@49
|
482 typename SpCol<eT>::row_iterator
|
Chris@49
|
483 SpCol<eT>::begin_row(const uword row_num)
|
Chris@49
|
484 {
|
Chris@49
|
485 arma_extra_debug_sigprint();
|
Chris@49
|
486
|
Chris@49
|
487 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "begin_row(): index out of bounds");
|
Chris@49
|
488
|
Chris@49
|
489 return row_iterator(*this, row_num, 0);
|
Chris@49
|
490 }
|
Chris@49
|
491
|
Chris@49
|
492
|
Chris@49
|
493
|
Chris@49
|
494 template<typename eT>
|
Chris@49
|
495 inline
|
Chris@49
|
496 typename SpCol<eT>::const_row_iterator
|
Chris@49
|
497 SpCol<eT>::begin_row(const uword row_num) const
|
Chris@49
|
498 {
|
Chris@49
|
499 arma_extra_debug_sigprint();
|
Chris@49
|
500
|
Chris@49
|
501 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "begin_row(): index out of bounds");
|
Chris@49
|
502
|
Chris@49
|
503 return const_row_iterator(*this, row_num, 0);
|
Chris@49
|
504 }
|
Chris@49
|
505
|
Chris@49
|
506
|
Chris@49
|
507
|
Chris@49
|
508 template<typename eT>
|
Chris@49
|
509 inline
|
Chris@49
|
510 typename SpCol<eT>::row_iterator
|
Chris@49
|
511 SpCol<eT>::end_row(const uword row_num)
|
Chris@49
|
512 {
|
Chris@49
|
513 arma_extra_debug_sigprint();
|
Chris@49
|
514
|
Chris@49
|
515 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "end_row(): index out of bounds");
|
Chris@49
|
516
|
Chris@49
|
517 return row_iterator(*this, row_num + 1, 0);
|
Chris@49
|
518 }
|
Chris@49
|
519
|
Chris@49
|
520
|
Chris@49
|
521
|
Chris@49
|
522 template<typename eT>
|
Chris@49
|
523 inline
|
Chris@49
|
524 typename SpCol<eT>::const_row_iterator
|
Chris@49
|
525 SpCol<eT>::end_row(const uword row_num) const
|
Chris@49
|
526 {
|
Chris@49
|
527 arma_extra_debug_sigprint();
|
Chris@49
|
528
|
Chris@49
|
529 arma_debug_check( (row_num >= SpMat<eT>::n_rows), "end_row(): index out of bounds");
|
Chris@49
|
530
|
Chris@49
|
531 return const_row_iterator(*this, row_num + 1, 0);
|
Chris@49
|
532 }
|
Chris@49
|
533
|
Chris@49
|
534
|
Chris@49
|
535
|
Chris@49
|
536 #ifdef ARMA_EXTRA_SPCOL_MEAT
|
Chris@49
|
537 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPCOL_MEAT)
|
Chris@49
|
538 #endif
|
Chris@49
|
539
|
Chris@49
|
540
|
Chris@49
|
541
|
Chris@49
|
542 //! @}
|