1 | // This file is part of Eigen, a lightweight C++ template library |
2 | // for linear algebra. |
3 | // |
4 | // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> |
5 | // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> |
6 | // |
7 | // This Source Code Form is subject to the terms of the Mozilla |
8 | // Public License v. 2.0. If a copy of the MPL was not distributed |
9 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
10 | |
11 | #ifndef EIGEN_PARSED_BY_DOXYGEN |
12 | |
13 | /// \internal expression type of a column */ |
14 | typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ColXpr; |
15 | typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ConstColXpr; |
16 | /// \internal expression type of a row */ |
17 | typedef Block<Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowXpr; |
18 | typedef const Block<const Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowXpr; |
19 | /// \internal expression type of a block of whole columns */ |
20 | typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ColsBlockXpr; |
21 | typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ConstColsBlockXpr; |
22 | /// \internal expression type of a block of whole rows */ |
23 | typedef Block<Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowsBlockXpr; |
24 | typedef const Block<const Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowsBlockXpr; |
25 | /// \internal expression type of a block of whole columns */ |
26 | template<int N> struct NColsBlockXpr { typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; }; |
27 | template<int N> struct ConstNColsBlockXpr { typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; }; |
28 | /// \internal expression type of a block of whole rows */ |
29 | template<int N> struct NRowsBlockXpr { typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; }; |
30 | template<int N> struct ConstNRowsBlockXpr { typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; }; |
31 | /// \internal expression of a block */ |
32 | typedef Block<Derived> BlockXpr; |
33 | typedef const Block<const Derived> ConstBlockXpr; |
34 | /// \internal expression of a block of fixed sizes */ |
35 | template<int Rows, int Cols> struct FixedBlockXpr { typedef Block<Derived,Rows,Cols> Type; }; |
36 | template<int Rows, int Cols> struct ConstFixedBlockXpr { typedef Block<const Derived,Rows,Cols> Type; }; |
37 | |
38 | typedef VectorBlock<Derived> SegmentReturnType; |
39 | typedef const VectorBlock<const Derived> ConstSegmentReturnType; |
40 | template<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; }; |
41 | template<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; }; |
42 | |
43 | #endif // not EIGEN_PARSED_BY_DOXYGEN |
44 | |
45 | /// \returns a dynamic-size expression of a block in *this. |
46 | /// |
47 | /// \param startRow the first row in the block |
48 | /// \param startCol the first column in the block |
49 | /// \param blockRows the number of rows in the block |
50 | /// \param blockCols the number of columns in the block |
51 | /// |
52 | /// Example: \include MatrixBase_block_int_int_int_int.cpp |
53 | /// Output: \verbinclude MatrixBase_block_int_int_int_int.out |
54 | /// |
55 | /// \note Even though the returned expression has dynamic size, in the case |
56 | /// when it is applied to a fixed-size matrix, it inherits a fixed maximal size, |
57 | /// which means that evaluating it does not cause a dynamic memory allocation. |
58 | /// |
59 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
60 | /// |
61 | /// \sa class Block, block(Index,Index) |
62 | /// |
63 | EIGEN_DEVICE_FUNC |
64 | inline BlockXpr block(Index startRow, Index startCol, Index blockRows, Index blockCols) |
65 | { |
66 | return BlockXpr(derived(), startRow, startCol, blockRows, blockCols); |
67 | } |
68 | |
69 | /// This is the const version of block(Index,Index,Index,Index). */ |
70 | EIGEN_DEVICE_FUNC |
71 | inline const ConstBlockXpr block(Index startRow, Index startCol, Index blockRows, Index blockCols) const |
72 | { |
73 | return ConstBlockXpr(derived(), startRow, startCol, blockRows, blockCols); |
74 | } |
75 | |
76 | |
77 | |
78 | |
79 | /// \returns a dynamic-size expression of a top-right corner of *this. |
80 | /// |
81 | /// \param cRows the number of rows in the corner |
82 | /// \param cCols the number of columns in the corner |
83 | /// |
84 | /// Example: \include MatrixBase_topRightCorner_int_int.cpp |
85 | /// Output: \verbinclude MatrixBase_topRightCorner_int_int.out |
86 | /// |
87 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
88 | /// |
89 | /// \sa class Block, block(Index,Index,Index,Index) |
90 | /// |
91 | EIGEN_DEVICE_FUNC |
92 | inline BlockXpr topRightCorner(Index cRows, Index cCols) |
93 | { |
94 | return BlockXpr(derived(), 0, cols() - cCols, cRows, cCols); |
95 | } |
96 | |
97 | /// This is the const version of topRightCorner(Index, Index). |
98 | EIGEN_DEVICE_FUNC |
99 | inline const ConstBlockXpr topRightCorner(Index cRows, Index cCols) const |
100 | { |
101 | return ConstBlockXpr(derived(), 0, cols() - cCols, cRows, cCols); |
102 | } |
103 | |
104 | /// \returns an expression of a fixed-size top-right corner of *this. |
105 | /// |
106 | /// \tparam CRows the number of rows in the corner |
107 | /// \tparam CCols the number of columns in the corner |
108 | /// |
109 | /// Example: \include MatrixBase_template_int_int_topRightCorner.cpp |
110 | /// Output: \verbinclude MatrixBase_template_int_int_topRightCorner.out |
111 | /// |
112 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
113 | /// |
114 | /// \sa class Block, block<int,int>(Index,Index) |
115 | /// |
116 | template<int CRows, int CCols> |
117 | EIGEN_DEVICE_FUNC |
118 | inline typename FixedBlockXpr<CRows,CCols>::Type topRightCorner() |
119 | { |
120 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - CCols); |
121 | } |
122 | |
123 | /// This is the const version of topRightCorner<int, int>(). |
124 | template<int CRows, int CCols> |
125 | EIGEN_DEVICE_FUNC |
126 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type topRightCorner() const |
127 | { |
128 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - CCols); |
129 | } |
130 | |
131 | /// \returns an expression of a top-right corner of *this. |
132 | /// |
133 | /// \tparam CRows number of rows in corner as specified at compile-time |
134 | /// \tparam CCols number of columns in corner as specified at compile-time |
135 | /// \param cRows number of rows in corner as specified at run-time |
136 | /// \param cCols number of columns in corner as specified at run-time |
137 | /// |
138 | /// This function is mainly useful for corners where the number of rows is specified at compile-time |
139 | /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time |
140 | /// information should not contradict. In other words, \a cRows should equal \a CRows unless |
141 | /// \a CRows is \a Dynamic, and the same for the number of columns. |
142 | /// |
143 | /// Example: \include MatrixBase_template_int_int_topRightCorner_int_int.cpp |
144 | /// Output: \verbinclude MatrixBase_template_int_int_topRightCorner_int_int.out |
145 | /// |
146 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
147 | /// |
148 | /// \sa class Block |
149 | /// |
150 | template<int CRows, int CCols> |
151 | inline typename FixedBlockXpr<CRows,CCols>::Type topRightCorner(Index cRows, Index cCols) |
152 | { |
153 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols); |
154 | } |
155 | |
156 | /// This is the const version of topRightCorner<int, int>(Index, Index). |
157 | template<int CRows, int CCols> |
158 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type topRightCorner(Index cRows, Index cCols) const |
159 | { |
160 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols); |
161 | } |
162 | |
163 | |
164 | |
165 | /// \returns a dynamic-size expression of a top-left corner of *this. |
166 | /// |
167 | /// \param cRows the number of rows in the corner |
168 | /// \param cCols the number of columns in the corner |
169 | /// |
170 | /// Example: \include MatrixBase_topLeftCorner_int_int.cpp |
171 | /// Output: \verbinclude MatrixBase_topLeftCorner_int_int.out |
172 | /// |
173 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
174 | /// |
175 | /// \sa class Block, block(Index,Index,Index,Index) |
176 | /// |
177 | EIGEN_DEVICE_FUNC |
178 | inline BlockXpr topLeftCorner(Index cRows, Index cCols) |
179 | { |
180 | return BlockXpr(derived(), 0, 0, cRows, cCols); |
181 | } |
182 | |
183 | /// This is the const version of topLeftCorner(Index, Index). |
184 | EIGEN_DEVICE_FUNC |
185 | inline const ConstBlockXpr topLeftCorner(Index cRows, Index cCols) const |
186 | { |
187 | return ConstBlockXpr(derived(), 0, 0, cRows, cCols); |
188 | } |
189 | |
190 | /// \returns an expression of a fixed-size top-left corner of *this. |
191 | /// |
192 | /// The template parameters CRows and CCols are the number of rows and columns in the corner. |
193 | /// |
194 | /// Example: \include MatrixBase_template_int_int_topLeftCorner.cpp |
195 | /// Output: \verbinclude MatrixBase_template_int_int_topLeftCorner.out |
196 | /// |
197 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
198 | /// |
199 | /// \sa class Block, block(Index,Index,Index,Index) |
200 | /// |
201 | template<int CRows, int CCols> |
202 | EIGEN_DEVICE_FUNC |
203 | inline typename FixedBlockXpr<CRows,CCols>::Type topLeftCorner() |
204 | { |
205 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0); |
206 | } |
207 | |
208 | /// This is the const version of topLeftCorner<int, int>(). |
209 | template<int CRows, int CCols> |
210 | EIGEN_DEVICE_FUNC |
211 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type topLeftCorner() const |
212 | { |
213 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0); |
214 | } |
215 | |
216 | /// \returns an expression of a top-left corner of *this. |
217 | /// |
218 | /// \tparam CRows number of rows in corner as specified at compile-time |
219 | /// \tparam CCols number of columns in corner as specified at compile-time |
220 | /// \param cRows number of rows in corner as specified at run-time |
221 | /// \param cCols number of columns in corner as specified at run-time |
222 | /// |
223 | /// This function is mainly useful for corners where the number of rows is specified at compile-time |
224 | /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time |
225 | /// information should not contradict. In other words, \a cRows should equal \a CRows unless |
226 | /// \a CRows is \a Dynamic, and the same for the number of columns. |
227 | /// |
228 | /// Example: \include MatrixBase_template_int_int_topLeftCorner_int_int.cpp |
229 | /// Output: \verbinclude MatrixBase_template_int_int_topLeftCorner_int_int.out |
230 | /// |
231 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
232 | /// |
233 | /// \sa class Block |
234 | /// |
235 | template<int CRows, int CCols> |
236 | inline typename FixedBlockXpr<CRows,CCols>::Type topLeftCorner(Index cRows, Index cCols) |
237 | { |
238 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0, cRows, cCols); |
239 | } |
240 | |
241 | /// This is the const version of topLeftCorner<int, int>(Index, Index). |
242 | template<int CRows, int CCols> |
243 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type topLeftCorner(Index cRows, Index cCols) const |
244 | { |
245 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0, cRows, cCols); |
246 | } |
247 | |
248 | |
249 | |
250 | /// \returns a dynamic-size expression of a bottom-right corner of *this. |
251 | /// |
252 | /// \param cRows the number of rows in the corner |
253 | /// \param cCols the number of columns in the corner |
254 | /// |
255 | /// Example: \include MatrixBase_bottomRightCorner_int_int.cpp |
256 | /// Output: \verbinclude MatrixBase_bottomRightCorner_int_int.out |
257 | /// |
258 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
259 | /// |
260 | /// \sa class Block, block(Index,Index,Index,Index) |
261 | /// |
262 | EIGEN_DEVICE_FUNC |
263 | inline BlockXpr bottomRightCorner(Index cRows, Index cCols) |
264 | { |
265 | return BlockXpr(derived(), rows() - cRows, cols() - cCols, cRows, cCols); |
266 | } |
267 | |
268 | /// This is the const version of bottomRightCorner(Index, Index). |
269 | EIGEN_DEVICE_FUNC |
270 | inline const ConstBlockXpr bottomRightCorner(Index cRows, Index cCols) const |
271 | { |
272 | return ConstBlockXpr(derived(), rows() - cRows, cols() - cCols, cRows, cCols); |
273 | } |
274 | |
275 | /// \returns an expression of a fixed-size bottom-right corner of *this. |
276 | /// |
277 | /// The template parameters CRows and CCols are the number of rows and columns in the corner. |
278 | /// |
279 | /// Example: \include MatrixBase_template_int_int_bottomRightCorner.cpp |
280 | /// Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner.out |
281 | /// |
282 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
283 | /// |
284 | /// \sa class Block, block(Index,Index,Index,Index) |
285 | /// |
286 | template<int CRows, int CCols> |
287 | EIGEN_DEVICE_FUNC |
288 | inline typename FixedBlockXpr<CRows,CCols>::Type bottomRightCorner() |
289 | { |
290 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, cols() - CCols); |
291 | } |
292 | |
293 | /// This is the const version of bottomRightCorner<int, int>(). |
294 | template<int CRows, int CCols> |
295 | EIGEN_DEVICE_FUNC |
296 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomRightCorner() const |
297 | { |
298 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, cols() - CCols); |
299 | } |
300 | |
301 | /// \returns an expression of a bottom-right corner of *this. |
302 | /// |
303 | /// \tparam CRows number of rows in corner as specified at compile-time |
304 | /// \tparam CCols number of columns in corner as specified at compile-time |
305 | /// \param cRows number of rows in corner as specified at run-time |
306 | /// \param cCols number of columns in corner as specified at run-time |
307 | /// |
308 | /// This function is mainly useful for corners where the number of rows is specified at compile-time |
309 | /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time |
310 | /// information should not contradict. In other words, \a cRows should equal \a CRows unless |
311 | /// \a CRows is \a Dynamic, and the same for the number of columns. |
312 | /// |
313 | /// Example: \include MatrixBase_template_int_int_bottomRightCorner_int_int.cpp |
314 | /// Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner_int_int.out |
315 | /// |
316 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
317 | /// |
318 | /// \sa class Block |
319 | /// |
320 | template<int CRows, int CCols> |
321 | inline typename FixedBlockXpr<CRows,CCols>::Type bottomRightCorner(Index cRows, Index cCols) |
322 | { |
323 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols); |
324 | } |
325 | |
326 | /// This is the const version of bottomRightCorner<int, int>(Index, Index). |
327 | template<int CRows, int CCols> |
328 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomRightCorner(Index cRows, Index cCols) const |
329 | { |
330 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols); |
331 | } |
332 | |
333 | |
334 | |
335 | /// \returns a dynamic-size expression of a bottom-left corner of *this. |
336 | /// |
337 | /// \param cRows the number of rows in the corner |
338 | /// \param cCols the number of columns in the corner |
339 | /// |
340 | /// Example: \include MatrixBase_bottomLeftCorner_int_int.cpp |
341 | /// Output: \verbinclude MatrixBase_bottomLeftCorner_int_int.out |
342 | /// |
343 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
344 | /// |
345 | /// \sa class Block, block(Index,Index,Index,Index) |
346 | /// |
347 | EIGEN_DEVICE_FUNC |
348 | inline BlockXpr bottomLeftCorner(Index cRows, Index cCols) |
349 | { |
350 | return BlockXpr(derived(), rows() - cRows, 0, cRows, cCols); |
351 | } |
352 | |
353 | /// This is the const version of bottomLeftCorner(Index, Index). |
354 | EIGEN_DEVICE_FUNC |
355 | inline const ConstBlockXpr bottomLeftCorner(Index cRows, Index cCols) const |
356 | { |
357 | return ConstBlockXpr(derived(), rows() - cRows, 0, cRows, cCols); |
358 | } |
359 | |
360 | /// \returns an expression of a fixed-size bottom-left corner of *this. |
361 | /// |
362 | /// The template parameters CRows and CCols are the number of rows and columns in the corner. |
363 | /// |
364 | /// Example: \include MatrixBase_template_int_int_bottomLeftCorner.cpp |
365 | /// Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner.out |
366 | /// |
367 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
368 | /// |
369 | /// \sa class Block, block(Index,Index,Index,Index) |
370 | /// |
371 | template<int CRows, int CCols> |
372 | EIGEN_DEVICE_FUNC |
373 | inline typename FixedBlockXpr<CRows,CCols>::Type bottomLeftCorner() |
374 | { |
375 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, 0); |
376 | } |
377 | |
378 | /// This is the const version of bottomLeftCorner<int, int>(). |
379 | template<int CRows, int CCols> |
380 | EIGEN_DEVICE_FUNC |
381 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomLeftCorner() const |
382 | { |
383 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, 0); |
384 | } |
385 | |
386 | /// \returns an expression of a bottom-left corner of *this. |
387 | /// |
388 | /// \tparam CRows number of rows in corner as specified at compile-time |
389 | /// \tparam CCols number of columns in corner as specified at compile-time |
390 | /// \param cRows number of rows in corner as specified at run-time |
391 | /// \param cCols number of columns in corner as specified at run-time |
392 | /// |
393 | /// This function is mainly useful for corners where the number of rows is specified at compile-time |
394 | /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time |
395 | /// information should not contradict. In other words, \a cRows should equal \a CRows unless |
396 | /// \a CRows is \a Dynamic, and the same for the number of columns. |
397 | /// |
398 | /// Example: \include MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp |
399 | /// Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner_int_int.out |
400 | /// |
401 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
402 | /// |
403 | /// \sa class Block |
404 | /// |
405 | template<int CRows, int CCols> |
406 | inline typename FixedBlockXpr<CRows,CCols>::Type bottomLeftCorner(Index cRows, Index cCols) |
407 | { |
408 | return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols); |
409 | } |
410 | |
411 | /// This is the const version of bottomLeftCorner<int, int>(Index, Index). |
412 | template<int CRows, int CCols> |
413 | inline const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomLeftCorner(Index cRows, Index cCols) const |
414 | { |
415 | return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols); |
416 | } |
417 | |
418 | |
419 | |
420 | /// \returns a block consisting of the top rows of *this. |
421 | /// |
422 | /// \param n the number of rows in the block |
423 | /// |
424 | /// Example: \include MatrixBase_topRows_int.cpp |
425 | /// Output: \verbinclude MatrixBase_topRows_int.out |
426 | /// |
427 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
428 | /// |
429 | /// \sa class Block, block(Index,Index,Index,Index) |
430 | /// |
431 | EIGEN_DEVICE_FUNC |
432 | inline RowsBlockXpr topRows(Index n) |
433 | { |
434 | return RowsBlockXpr(derived(), 0, 0, n, cols()); |
435 | } |
436 | |
437 | /// This is the const version of topRows(Index). |
438 | EIGEN_DEVICE_FUNC |
439 | inline ConstRowsBlockXpr topRows(Index n) const |
440 | { |
441 | return ConstRowsBlockXpr(derived(), 0, 0, n, cols()); |
442 | } |
443 | |
444 | /// \returns a block consisting of the top rows of *this. |
445 | /// |
446 | /// \tparam N the number of rows in the block as specified at compile-time |
447 | /// \param n the number of rows in the block as specified at run-time |
448 | /// |
449 | /// The compile-time and run-time information should not contradict. In other words, |
450 | /// \a n should equal \a N unless \a N is \a Dynamic. |
451 | /// |
452 | /// Example: \include MatrixBase_template_int_topRows.cpp |
453 | /// Output: \verbinclude MatrixBase_template_int_topRows.out |
454 | /// |
455 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
456 | /// |
457 | /// \sa class Block, block(Index,Index,Index,Index) |
458 | /// |
459 | template<int N> |
460 | EIGEN_DEVICE_FUNC |
461 | inline typename NRowsBlockXpr<N>::Type topRows(Index n = N) |
462 | { |
463 | return typename NRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols()); |
464 | } |
465 | |
466 | /// This is the const version of topRows<int>(). |
467 | template<int N> |
468 | EIGEN_DEVICE_FUNC |
469 | inline typename ConstNRowsBlockXpr<N>::Type topRows(Index n = N) const |
470 | { |
471 | return typename ConstNRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols()); |
472 | } |
473 | |
474 | |
475 | |
476 | /// \returns a block consisting of the bottom rows of *this. |
477 | /// |
478 | /// \param n the number of rows in the block |
479 | /// |
480 | /// Example: \include MatrixBase_bottomRows_int.cpp |
481 | /// Output: \verbinclude MatrixBase_bottomRows_int.out |
482 | /// |
483 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
484 | /// |
485 | /// \sa class Block, block(Index,Index,Index,Index) |
486 | /// |
487 | EIGEN_DEVICE_FUNC |
488 | inline RowsBlockXpr bottomRows(Index n) |
489 | { |
490 | return RowsBlockXpr(derived(), rows() - n, 0, n, cols()); |
491 | } |
492 | |
493 | /// This is the const version of bottomRows(Index). |
494 | EIGEN_DEVICE_FUNC |
495 | inline ConstRowsBlockXpr bottomRows(Index n) const |
496 | { |
497 | return ConstRowsBlockXpr(derived(), rows() - n, 0, n, cols()); |
498 | } |
499 | |
500 | /// \returns a block consisting of the bottom rows of *this. |
501 | /// |
502 | /// \tparam N the number of rows in the block as specified at compile-time |
503 | /// \param n the number of rows in the block as specified at run-time |
504 | /// |
505 | /// The compile-time and run-time information should not contradict. In other words, |
506 | /// \a n should equal \a N unless \a N is \a Dynamic. |
507 | /// |
508 | /// Example: \include MatrixBase_template_int_bottomRows.cpp |
509 | /// Output: \verbinclude MatrixBase_template_int_bottomRows.out |
510 | /// |
511 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
512 | /// |
513 | /// \sa class Block, block(Index,Index,Index,Index) |
514 | /// |
515 | template<int N> |
516 | EIGEN_DEVICE_FUNC |
517 | inline typename NRowsBlockXpr<N>::Type bottomRows(Index n = N) |
518 | { |
519 | return typename NRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols()); |
520 | } |
521 | |
522 | /// This is the const version of bottomRows<int>(). |
523 | template<int N> |
524 | EIGEN_DEVICE_FUNC |
525 | inline typename ConstNRowsBlockXpr<N>::Type bottomRows(Index n = N) const |
526 | { |
527 | return typename ConstNRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols()); |
528 | } |
529 | |
530 | |
531 | |
532 | /// \returns a block consisting of a range of rows of *this. |
533 | /// |
534 | /// \param startRow the index of the first row in the block |
535 | /// \param n the number of rows in the block |
536 | /// |
537 | /// Example: \include DenseBase_middleRows_int.cpp |
538 | /// Output: \verbinclude DenseBase_middleRows_int.out |
539 | /// |
540 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
541 | /// |
542 | /// \sa class Block, block(Index,Index,Index,Index) |
543 | /// |
544 | EIGEN_DEVICE_FUNC |
545 | inline RowsBlockXpr middleRows(Index startRow, Index n) |
546 | { |
547 | return RowsBlockXpr(derived(), startRow, 0, n, cols()); |
548 | } |
549 | |
550 | /// This is the const version of middleRows(Index,Index). |
551 | EIGEN_DEVICE_FUNC |
552 | inline ConstRowsBlockXpr middleRows(Index startRow, Index n) const |
553 | { |
554 | return ConstRowsBlockXpr(derived(), startRow, 0, n, cols()); |
555 | } |
556 | |
557 | /// \returns a block consisting of a range of rows of *this. |
558 | /// |
559 | /// \tparam N the number of rows in the block as specified at compile-time |
560 | /// \param startRow the index of the first row in the block |
561 | /// \param n the number of rows in the block as specified at run-time |
562 | /// |
563 | /// The compile-time and run-time information should not contradict. In other words, |
564 | /// \a n should equal \a N unless \a N is \a Dynamic. |
565 | /// |
566 | /// Example: \include DenseBase_template_int_middleRows.cpp |
567 | /// Output: \verbinclude DenseBase_template_int_middleRows.out |
568 | /// |
569 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
570 | /// |
571 | /// \sa class Block, block(Index,Index,Index,Index) |
572 | /// |
573 | template<int N> |
574 | EIGEN_DEVICE_FUNC |
575 | inline typename NRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) |
576 | { |
577 | return typename NRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols()); |
578 | } |
579 | |
580 | /// This is the const version of middleRows<int>(). |
581 | template<int N> |
582 | EIGEN_DEVICE_FUNC |
583 | inline typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) const |
584 | { |
585 | return typename ConstNRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols()); |
586 | } |
587 | |
588 | |
589 | |
590 | /// \returns a block consisting of the left columns of *this. |
591 | /// |
592 | /// \param n the number of columns in the block |
593 | /// |
594 | /// Example: \include MatrixBase_leftCols_int.cpp |
595 | /// Output: \verbinclude MatrixBase_leftCols_int.out |
596 | /// |
597 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
598 | /// |
599 | /// \sa class Block, block(Index,Index,Index,Index) |
600 | /// |
601 | EIGEN_DEVICE_FUNC |
602 | inline ColsBlockXpr leftCols(Index n) |
603 | { |
604 | return ColsBlockXpr(derived(), 0, 0, rows(), n); |
605 | } |
606 | |
607 | /// This is the const version of leftCols(Index). |
608 | EIGEN_DEVICE_FUNC |
609 | inline ConstColsBlockXpr leftCols(Index n) const |
610 | { |
611 | return ConstColsBlockXpr(derived(), 0, 0, rows(), n); |
612 | } |
613 | |
614 | /// \returns a block consisting of the left columns of *this. |
615 | /// |
616 | /// \tparam N the number of columns in the block as specified at compile-time |
617 | /// \param n the number of columns in the block as specified at run-time |
618 | /// |
619 | /// The compile-time and run-time information should not contradict. In other words, |
620 | /// \a n should equal \a N unless \a N is \a Dynamic. |
621 | /// |
622 | /// Example: \include MatrixBase_template_int_leftCols.cpp |
623 | /// Output: \verbinclude MatrixBase_template_int_leftCols.out |
624 | /// |
625 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
626 | /// |
627 | /// \sa class Block, block(Index,Index,Index,Index) |
628 | /// |
629 | template<int N> |
630 | EIGEN_DEVICE_FUNC |
631 | inline typename NColsBlockXpr<N>::Type leftCols(Index n = N) |
632 | { |
633 | return typename NColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n); |
634 | } |
635 | |
636 | /// This is the const version of leftCols<int>(). |
637 | template<int N> |
638 | EIGEN_DEVICE_FUNC |
639 | inline typename ConstNColsBlockXpr<N>::Type leftCols(Index n = N) const |
640 | { |
641 | return typename ConstNColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n); |
642 | } |
643 | |
644 | |
645 | |
646 | /// \returns a block consisting of the right columns of *this. |
647 | /// |
648 | /// \param n the number of columns in the block |
649 | /// |
650 | /// Example: \include MatrixBase_rightCols_int.cpp |
651 | /// Output: \verbinclude MatrixBase_rightCols_int.out |
652 | /// |
653 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
654 | /// |
655 | /// \sa class Block, block(Index,Index,Index,Index) |
656 | /// |
657 | EIGEN_DEVICE_FUNC |
658 | inline ColsBlockXpr rightCols(Index n) |
659 | { |
660 | return ColsBlockXpr(derived(), 0, cols() - n, rows(), n); |
661 | } |
662 | |
663 | /// This is the const version of rightCols(Index). |
664 | EIGEN_DEVICE_FUNC |
665 | inline ConstColsBlockXpr rightCols(Index n) const |
666 | { |
667 | return ConstColsBlockXpr(derived(), 0, cols() - n, rows(), n); |
668 | } |
669 | |
670 | /// \returns a block consisting of the right columns of *this. |
671 | /// |
672 | /// \tparam N the number of columns in the block as specified at compile-time |
673 | /// \param n the number of columns in the block as specified at run-time |
674 | /// |
675 | /// The compile-time and run-time information should not contradict. In other words, |
676 | /// \a n should equal \a N unless \a N is \a Dynamic. |
677 | /// |
678 | /// Example: \include MatrixBase_template_int_rightCols.cpp |
679 | /// Output: \verbinclude MatrixBase_template_int_rightCols.out |
680 | /// |
681 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
682 | /// |
683 | /// \sa class Block, block(Index,Index,Index,Index) |
684 | /// |
685 | template<int N> |
686 | EIGEN_DEVICE_FUNC |
687 | inline typename NColsBlockXpr<N>::Type rightCols(Index n = N) |
688 | { |
689 | return typename NColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n); |
690 | } |
691 | |
692 | /// This is the const version of rightCols<int>(). |
693 | template<int N> |
694 | EIGEN_DEVICE_FUNC |
695 | inline typename ConstNColsBlockXpr<N>::Type rightCols(Index n = N) const |
696 | { |
697 | return typename ConstNColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n); |
698 | } |
699 | |
700 | |
701 | |
702 | /// \returns a block consisting of a range of columns of *this. |
703 | /// |
704 | /// \param startCol the index of the first column in the block |
705 | /// \param numCols the number of columns in the block |
706 | /// |
707 | /// Example: \include DenseBase_middleCols_int.cpp |
708 | /// Output: \verbinclude DenseBase_middleCols_int.out |
709 | /// |
710 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
711 | /// |
712 | /// \sa class Block, block(Index,Index,Index,Index) |
713 | /// |
714 | EIGEN_DEVICE_FUNC |
715 | inline ColsBlockXpr middleCols(Index startCol, Index numCols) |
716 | { |
717 | return ColsBlockXpr(derived(), 0, startCol, rows(), numCols); |
718 | } |
719 | |
720 | /// This is the const version of middleCols(Index,Index). |
721 | EIGEN_DEVICE_FUNC |
722 | inline ConstColsBlockXpr middleCols(Index startCol, Index numCols) const |
723 | { |
724 | return ConstColsBlockXpr(derived(), 0, startCol, rows(), numCols); |
725 | } |
726 | |
727 | /// \returns a block consisting of a range of columns of *this. |
728 | /// |
729 | /// \tparam N the number of columns in the block as specified at compile-time |
730 | /// \param startCol the index of the first column in the block |
731 | /// \param n the number of columns in the block as specified at run-time |
732 | /// |
733 | /// The compile-time and run-time information should not contradict. In other words, |
734 | /// \a n should equal \a N unless \a N is \a Dynamic. |
735 | /// |
736 | /// Example: \include DenseBase_template_int_middleCols.cpp |
737 | /// Output: \verbinclude DenseBase_template_int_middleCols.out |
738 | /// |
739 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
740 | /// |
741 | /// \sa class Block, block(Index,Index,Index,Index) |
742 | /// |
743 | template<int N> |
744 | EIGEN_DEVICE_FUNC |
745 | inline typename NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) |
746 | { |
747 | return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n); |
748 | } |
749 | |
750 | /// This is the const version of middleCols<int>(). |
751 | template<int N> |
752 | EIGEN_DEVICE_FUNC |
753 | inline typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) const |
754 | { |
755 | return typename ConstNColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n); |
756 | } |
757 | |
758 | |
759 | |
760 | /// \returns a fixed-size expression of a block in *this. |
761 | /// |
762 | /// The template parameters \a NRows and \a NCols are the number of |
763 | /// rows and columns in the block. |
764 | /// |
765 | /// \param startRow the first row in the block |
766 | /// \param startCol the first column in the block |
767 | /// |
768 | /// Example: \include MatrixBase_block_int_int.cpp |
769 | /// Output: \verbinclude MatrixBase_block_int_int.out |
770 | /// |
771 | /// \note since block is a templated member, the keyword template has to be used |
772 | /// if the matrix type is also a template parameter: \code m.template block<3,3>(1,1); \endcode |
773 | /// |
774 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
775 | /// |
776 | /// \sa class Block, block(Index,Index,Index,Index) |
777 | /// |
778 | template<int NRows, int NCols> |
779 | EIGEN_DEVICE_FUNC |
780 | inline typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol) |
781 | { |
782 | return typename FixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol); |
783 | } |
784 | |
785 | /// This is the const version of block<>(Index, Index). */ |
786 | template<int NRows, int NCols> |
787 | EIGEN_DEVICE_FUNC |
788 | inline const typename ConstFixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol) const |
789 | { |
790 | return typename ConstFixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol); |
791 | } |
792 | |
793 | /// \returns an expression of a block in *this. |
794 | /// |
795 | /// \tparam NRows number of rows in block as specified at compile-time |
796 | /// \tparam NCols number of columns in block as specified at compile-time |
797 | /// \param startRow the first row in the block |
798 | /// \param startCol the first column in the block |
799 | /// \param blockRows number of rows in block as specified at run-time |
800 | /// \param blockCols number of columns in block as specified at run-time |
801 | /// |
802 | /// This function is mainly useful for blocks where the number of rows is specified at compile-time |
803 | /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time |
804 | /// information should not contradict. In other words, \a blockRows should equal \a NRows unless |
805 | /// \a NRows is \a Dynamic, and the same for the number of columns. |
806 | /// |
807 | /// Example: \include MatrixBase_template_int_int_block_int_int_int_int.cpp |
808 | /// Output: \verbinclude MatrixBase_template_int_int_block_int_int_int_int.cpp |
809 | /// |
810 | EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL |
811 | /// |
812 | /// \sa class Block, block(Index,Index,Index,Index) |
813 | /// |
814 | template<int NRows, int NCols> |
815 | inline typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol, |
816 | Index blockRows, Index blockCols) |
817 | { |
818 | return typename FixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol, blockRows, blockCols); |
819 | } |
820 | |
821 | /// This is the const version of block<>(Index, Index, Index, Index). |
822 | template<int NRows, int NCols> |
823 | inline const typename ConstFixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol, |
824 | Index blockRows, Index blockCols) const |
825 | { |
826 | return typename ConstFixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol, blockRows, blockCols); |
827 | } |
828 | |
829 | /// \returns an expression of the \a i-th column of *this. Note that the numbering starts at 0. |
830 | /// |
831 | /// Example: \include MatrixBase_col.cpp |
832 | /// Output: \verbinclude MatrixBase_col.out |
833 | /// |
834 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major) |
835 | /** |
836 | * \sa row(), class Block */ |
837 | EIGEN_DEVICE_FUNC |
838 | inline ColXpr col(Index i) |
839 | { |
840 | return ColXpr(derived(), i); |
841 | } |
842 | |
843 | /// This is the const version of col(). |
844 | EIGEN_DEVICE_FUNC |
845 | inline ConstColXpr col(Index i) const |
846 | { |
847 | return ConstColXpr(derived(), i); |
848 | } |
849 | |
850 | /// \returns an expression of the \a i-th row of *this. Note that the numbering starts at 0. |
851 | /// |
852 | /// Example: \include MatrixBase_row.cpp |
853 | /// Output: \verbinclude MatrixBase_row.out |
854 | /// |
855 | EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major) |
856 | /** |
857 | * \sa col(), class Block */ |
858 | EIGEN_DEVICE_FUNC |
859 | inline RowXpr row(Index i) |
860 | { |
861 | return RowXpr(derived(), i); |
862 | } |
863 | |
864 | /// This is the const version of row(). */ |
865 | EIGEN_DEVICE_FUNC |
866 | inline ConstRowXpr row(Index i) const |
867 | { |
868 | return ConstRowXpr(derived(), i); |
869 | } |
870 | |
871 | /// \returns a dynamic-size expression of a segment (i.e. a vector block) in *this. |
872 | /// |
873 | /// \only_for_vectors |
874 | /// |
875 | /// \param start the first coefficient in the segment |
876 | /// \param n the number of coefficients in the segment |
877 | /// |
878 | /// Example: \include MatrixBase_segment_int_int.cpp |
879 | /// Output: \verbinclude MatrixBase_segment_int_int.out |
880 | /// |
881 | /// \note Even though the returned expression has dynamic size, in the case |
882 | /// when it is applied to a fixed-size vector, it inherits a fixed maximal size, |
883 | /// which means that evaluating it does not cause a dynamic memory allocation. |
884 | /// |
885 | /// \sa class Block, segment(Index) |
886 | /// |
887 | EIGEN_DEVICE_FUNC |
888 | inline SegmentReturnType segment(Index start, Index n) |
889 | { |
890 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
891 | return SegmentReturnType(derived(), start, n); |
892 | } |
893 | |
894 | |
895 | /// This is the const version of segment(Index,Index). |
896 | EIGEN_DEVICE_FUNC |
897 | inline ConstSegmentReturnType segment(Index start, Index n) const |
898 | { |
899 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
900 | return ConstSegmentReturnType(derived(), start, n); |
901 | } |
902 | |
903 | /// \returns a dynamic-size expression of the first coefficients of *this. |
904 | /// |
905 | /// \only_for_vectors |
906 | /// |
907 | /// \param n the number of coefficients in the segment |
908 | /// |
909 | /// Example: \include MatrixBase_start_int.cpp |
910 | /// Output: \verbinclude MatrixBase_start_int.out |
911 | /// |
912 | /// \note Even though the returned expression has dynamic size, in the case |
913 | /// when it is applied to a fixed-size vector, it inherits a fixed maximal size, |
914 | /// which means that evaluating it does not cause a dynamic memory allocation. |
915 | /// |
916 | /// \sa class Block, block(Index,Index) |
917 | /// |
918 | EIGEN_DEVICE_FUNC |
919 | inline SegmentReturnType head(Index n) |
920 | { |
921 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
922 | return SegmentReturnType(derived(), 0, n); |
923 | } |
924 | |
925 | /// This is the const version of head(Index). |
926 | EIGEN_DEVICE_FUNC |
927 | inline ConstSegmentReturnType head(Index n) const |
928 | { |
929 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
930 | return ConstSegmentReturnType(derived(), 0, n); |
931 | } |
932 | |
933 | /// \returns a dynamic-size expression of the last coefficients of *this. |
934 | /// |
935 | /// \only_for_vectors |
936 | /// |
937 | /// \param n the number of coefficients in the segment |
938 | /// |
939 | /// Example: \include MatrixBase_end_int.cpp |
940 | /// Output: \verbinclude MatrixBase_end_int.out |
941 | /// |
942 | /// \note Even though the returned expression has dynamic size, in the case |
943 | /// when it is applied to a fixed-size vector, it inherits a fixed maximal size, |
944 | /// which means that evaluating it does not cause a dynamic memory allocation. |
945 | /// |
946 | /// \sa class Block, block(Index,Index) |
947 | /// |
948 | EIGEN_DEVICE_FUNC |
949 | inline SegmentReturnType tail(Index n) |
950 | { |
951 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
952 | return SegmentReturnType(derived(), this->size() - n, n); |
953 | } |
954 | |
955 | /// This is the const version of tail(Index). |
956 | EIGEN_DEVICE_FUNC |
957 | inline ConstSegmentReturnType tail(Index n) const |
958 | { |
959 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
960 | return ConstSegmentReturnType(derived(), this->size() - n, n); |
961 | } |
962 | |
963 | /// \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this |
964 | /// |
965 | /// \only_for_vectors |
966 | /// |
967 | /// \tparam N the number of coefficients in the segment as specified at compile-time |
968 | /// \param start the index of the first element in the segment |
969 | /// \param n the number of coefficients in the segment as specified at compile-time |
970 | /// |
971 | /// The compile-time and run-time information should not contradict. In other words, |
972 | /// \a n should equal \a N unless \a N is \a Dynamic. |
973 | /// |
974 | /// Example: \include MatrixBase_template_int_segment.cpp |
975 | /// Output: \verbinclude MatrixBase_template_int_segment.out |
976 | /// |
977 | /// \sa class Block |
978 | /// |
979 | template<int N> |
980 | EIGEN_DEVICE_FUNC |
981 | inline typename FixedSegmentReturnType<N>::Type segment(Index start, Index n = N) |
982 | { |
983 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
984 | return typename FixedSegmentReturnType<N>::Type(derived(), start, n); |
985 | } |
986 | |
987 | /// This is the const version of segment<int>(Index). |
988 | template<int N> |
989 | EIGEN_DEVICE_FUNC |
990 | inline typename ConstFixedSegmentReturnType<N>::Type segment(Index start, Index n = N) const |
991 | { |
992 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
993 | return typename ConstFixedSegmentReturnType<N>::Type(derived(), start, n); |
994 | } |
995 | |
996 | /// \returns a fixed-size expression of the first coefficients of *this. |
997 | /// |
998 | /// \only_for_vectors |
999 | /// |
1000 | /// \tparam N the number of coefficients in the segment as specified at compile-time |
1001 | /// \param n the number of coefficients in the segment as specified at run-time |
1002 | /// |
1003 | /// The compile-time and run-time information should not contradict. In other words, |
1004 | /// \a n should equal \a N unless \a N is \a Dynamic. |
1005 | /// |
1006 | /// Example: \include MatrixBase_template_int_start.cpp |
1007 | /// Output: \verbinclude MatrixBase_template_int_start.out |
1008 | /// |
1009 | /// \sa class Block |
1010 | /// |
1011 | template<int N> |
1012 | EIGEN_DEVICE_FUNC |
1013 | inline typename FixedSegmentReturnType<N>::Type head(Index n = N) |
1014 | { |
1015 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
1016 | return typename FixedSegmentReturnType<N>::Type(derived(), 0, n); |
1017 | } |
1018 | |
1019 | /// This is the const version of head<int>(). |
1020 | template<int N> |
1021 | EIGEN_DEVICE_FUNC |
1022 | inline typename ConstFixedSegmentReturnType<N>::Type head(Index n = N) const |
1023 | { |
1024 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
1025 | return typename ConstFixedSegmentReturnType<N>::Type(derived(), 0, n); |
1026 | } |
1027 | |
1028 | /// \returns a fixed-size expression of the last coefficients of *this. |
1029 | /// |
1030 | /// \only_for_vectors |
1031 | /// |
1032 | /// \tparam N the number of coefficients in the segment as specified at compile-time |
1033 | /// \param n the number of coefficients in the segment as specified at run-time |
1034 | /// |
1035 | /// The compile-time and run-time information should not contradict. In other words, |
1036 | /// \a n should equal \a N unless \a N is \a Dynamic. |
1037 | /// |
1038 | /// Example: \include MatrixBase_template_int_end.cpp |
1039 | /// Output: \verbinclude MatrixBase_template_int_end.out |
1040 | /// |
1041 | /// \sa class Block |
1042 | /// |
1043 | template<int N> |
1044 | EIGEN_DEVICE_FUNC |
1045 | inline typename FixedSegmentReturnType<N>::Type tail(Index n = N) |
1046 | { |
1047 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
1048 | return typename FixedSegmentReturnType<N>::Type(derived(), size() - n); |
1049 | } |
1050 | |
1051 | /// This is the const version of tail<int>. |
1052 | template<int N> |
1053 | EIGEN_DEVICE_FUNC |
1054 | inline typename ConstFixedSegmentReturnType<N>::Type tail(Index n = N) const |
1055 | { |
1056 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) |
1057 | return typename ConstFixedSegmentReturnType<N>::Type(derived(), size() - n); |
1058 | } |
1059 | |