source: pacpussensors/trunk/Vislab/lib3dv/eigen/Eigen/src/plugins/BlockMethods.h@ 136

Last change on this file since 136 was 136, checked in by ldecherf, 7 years ago

Doc

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