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 (at) inria.fr> 5 // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 (at) 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