Go to the documentation of this file.
23 #include <gtsam/dllexport.h>
24 #if GTSAM_ENABLE_BOOST_SERIALIZATION
25 #include <boost/serialization/nvp.hpp>
32 namespace serialization {
40 class VerticalBlockMatrix;
71 template<
typename CONTAINER>
76 matrix_.resize(variableColOffsets_.back(), variableColOffsets_.back());
81 template<
typename ITERATOR>
85 fillOffsets(firstBlockDim, lastBlockDim, appendOneDimension);
86 matrix_.resize(variableColOffsets_.back(), variableColOffsets_.back());
91 template<
typename CONTAINER>
98 if(matrix_.rows() != matrix_.cols())
99 throw std::invalid_argument(
"Requested to create a SymmetricBlockMatrix from a non-square matrix.");
100 if(variableColOffsets_.back() != matrix_.cols())
101 throw std::invalid_argument(
"Requested to create a SymmetricBlockMatrix with dimensions that do not sum to the total size of the provided matrix.");
116 DenseIndex rows()
const { assertInvariants();
return variableColOffsets_.back() - variableColOffsets_[blockStart_]; }
148 return block_(
J,
J).diagonal();
176 assert(i_startBlock < j_startBlock);
177 assert(i_endBlock <= j_startBlock);
178 return block_(i_startBlock, j_startBlock, i_endBlock - i_startBlock,
179 j_endBlock - j_startBlock);
185 assert(i_startBlock < j_startBlock);
186 assert(i_endBlock <= j_startBlock);
187 return block_(i_startBlock, j_startBlock, i_endBlock - i_startBlock,
188 j_endBlock - j_startBlock);
196 template <
typename XprType>
198 block_(
I,
I).triangularView<
Eigen::Upper>() = xpr.template triangularView<Eigen::Upper>();
202 template <
typename XprType>
208 block_(
J,
I) = xpr.transpose();
213 template <
typename XprType>
217 auto dest = block_(
I,
I);
218 assert(dest.rows() == xpr.
rows());
219 assert(dest.cols() == xpr.
cols());
229 template <
typename XprType>
233 block_(
I,
J).noalias() += xpr;
235 block_(
J,
I).noalias() += xpr.transpose();
254 template <
typename XprType>
256 full().triangularView<
Eigen::Upper>() = xpr.template triangularView<Eigen::Upper>();
273 void invertInPlace();
309 return variableColOffsets_.size();
314 return nOffsets() - 1;
321 assert(actual_index < nOffsets());
322 return variableColOffsets_[actual_index];
328 const std::array<DenseIndex, 4>
indices =
329 calcIndices(iBlock, jBlock, blockRows, blockCols);
336 const std::array<DenseIndex, 4>
indices =
337 calcIndices(iBlock, jBlock, blockRows, blockCols);
343 return block_(0, 0, nBlocks(), nBlocks());
348 return block_(0, 0, nBlocks(), nBlocks());
355 assert(blockRows >= 0);
356 assert(blockCols >= 0);
363 return {{denseI, denseJ, denseRows, denseCols}};
368 assert(matrix_.rows() == matrix_.cols());
369 assert(matrix_.cols() == variableColOffsets_.back());
370 assert(blockStart_ < (
DenseIndex)variableColOffsets_.size());
373 template<
typename ITERATOR>
374 void fillOffsets(ITERATOR firstBlockDim, ITERATOR lastBlockDim,
bool appendOneDimension)
376 variableColOffsets_.resize((lastBlockDim-firstBlockDim) + 1 + (appendOneDimension ? 1 : 0));
377 variableColOffsets_[0] = 0;
379 for(ITERATOR dim=firstBlockDim; dim!=lastBlockDim; ++dim) {
380 variableColOffsets_[
j+1] = variableColOffsets_[
j] + *dim;
383 if(appendOneDimension)
385 variableColOffsets_[
j+1] = variableColOffsets_[
j] + 1;
391 template<
typename SymmetricBlockMatrixType>
friend class SymmetricBlockMatrixBlockExpr;
394 #if GTSAM_ENABLE_BOOST_SERIALIZATION
396 friend class boost::serialization::access;
397 template<
class ARCHIVE>
398 void serialize(ARCHIVE & ar,
const unsigned int ) {
403 ar & BOOST_SERIALIZATION_NVP(matrix_);
404 ar & BOOST_SERIALIZATION_NVP(variableColOffsets_);
405 ar & BOOST_SERIALIZATION_NVP(blockStart_);
411 class CholeskyFailed;
const std::vector< size_t > dimensions
Eigen::Block< Matrix > Block
Block block_(DenseIndex iBlock, DenseIndex jBlock, DenseIndex blockRows=1, DenseIndex blockCols=1)
Get an arbitrary block from the matrix. Indices are in block units.
Expression of a fixed-size or dynamic-size block.
void assertInvariants() const
constBlock block_(DenseIndex iBlock, DenseIndex jBlock, DenseIndex blockRows=1, DenseIndex blockCols=1) const
Get an arbitrary block from the matrix. Indices are in block units.
void setOffDiagonalBlock(DenseIndex I, DenseIndex J, const XprType &xpr)
Set an off-diagonal block. Only the upper triangular portion of xpr is evaluated.
A thin wrapper around std::vector that uses a custom allocator.
Generic expression where a coefficient-wise binary operator is applied to two expressions.
constBlock full() const
Get the full matrix as a block.
DenseIndex blockStart_
Changes apparent matrix view, see main class comment.
Typedefs for easier changing of types.
DenseIndex nActualBlocks() const
Number of actual blocks in the full matrix.
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
typedef and functions to augment Eigen's MatrixXd
Eigen::SelfAdjointView< constBlock, Eigen::Upper > selfadjointView(DenseIndex I, DenseIndex J) const
Return the square sub-matrix that contains blocks(i:j, i:j).
Block full()
Get the full matrix as a block.
DenseIndex blockStart() const
Expression of a selfadjoint matrix from a triangular part of a dense matrix.
void setDiagonalBlock(DenseIndex I, const XprType &xpr)
Set a diagonal block. Only the upper triangular portion of xpr is evaluated.
Eigen::SelfAdjointView< constBlock, Eigen::Upper > diagonalBlock(DenseIndex J) const
Return the J'th diagonal block as a self adjoint view.
constBlock aboveDiagonalRange(DenseIndex i_startBlock, DenseIndex i_endBlock, DenseIndex j_startBlock, DenseIndex j_endBlock) const
Get a range [i,j) from the matrix. Indices are in block units.
m m block(1, 0, 2, 2)<< 4
SymmetricBlockMatrix(const CONTAINER &dimensions, const Matrix &matrix, bool appendOneDimension=false)
Construct from a container of the sizes of each vertical block and a pre-prepared matrix.
Block aboveDiagonalRange(DenseIndex i_startBlock, DenseIndex i_endBlock, DenseIndex j_startBlock, DenseIndex j_endBlock)
Get a range [i,j) from the matrix. Indices are in block units.
Matrix matrix_
The full matrix.
JacobiRotation< float > J
const MATRIX::ConstRowXpr row(const MATRIX &A, size_t j)
void setAllZero()
Set entire matrix zero.
void setFullMatrix(const XprType &xpr)
Set the entire active matrix. Only reads the upper triangular part of xpr.
SymmetricBlockMatrix(ITERATOR firstBlockDim, ITERATOR lastBlockDim, bool appendOneDimension=false)
Construct from iterator over the sizes of each vertical block.
DenseIndex nBlocks() const
Block count.
DenseIndex rows() const
Row size.
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate offset
SymmetricBlockMatrix This
DenseIndex nOffsets() const
Number of offsets in the full matrix.
Eigen::TriangularView< constBlock, Eigen::Upper > triangularView(DenseIndex I, DenseIndex J) const
Return the square sub-matrix that contains blocks(i:j, i:j) as a triangular view.
std::array< DenseIndex, 4 > calcIndices(DenseIndex iBlock, DenseIndex jBlock, DenseIndex blockRows, DenseIndex blockCols) const
Compute the indices into the underlying matrix for a given block.
void updateDiagonalBlock(DenseIndex I, const XprType &xpr)
Increment the diagonal block by the values in xpr. Only reads the upper triangular part of xpr.
Eigen::SelfAdjointView< Block, Eigen::Upper > selfadjointView()
Get self adjoint view.
DenseIndex cols() const
Column size.
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
void setZero()
Set the entire active matrix zero.
bool choleskyPartial(Matrix &ABC, size_t nFrontal, size_t topleft)
ptrdiff_t DenseIndex
The index type for Eigen objects.
void updateOffDiagonalBlock(DenseIndex I, DenseIndex J, const XprType &xpr)
Vector diagonal(DenseIndex J) const
Get the diagonal of the J'th diagonal block.
Eigen::SelfAdjointView< Block, Eigen::Upper > diagonalBlock(DenseIndex J)
Return the J'th diagonal block as a self adjoint view.
void split(const G &g, const PredecessorMap< KEY > &tree, G &Ab1, G &Ab2)
DenseIndex getDim(DenseIndex block) const
Number of dimensions for variable on this diagonal block.
DenseIndex & blockStart()
DenseIndex offset(DenseIndex block) const
Get an offset for a block index (in the active view).
SymmetricBlockMatrix(const CONTAINER &dimensions, bool appendOneDimension=false)
Construct from a container of the sizes of each block.
constBlock aboveDiagonalBlock(DenseIndex I, DenseIndex J) const
Get block above the diagonal (I, J).
Eigen::Block< const Matrix > constBlock
Eigen::SelfAdjointView< constBlock, Eigen::Upper > selfadjointView() const
Get self adjoint view.
Expression of a triangular part in a matrix.
void fillOffsets(ITERATOR firstBlockDim, ITERATOR lastBlockDim, bool appendOneDimension)
FastVector< DenseIndex > variableColOffsets_
the starting columns of each block (0-based)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
gtsam
Author(s):
autogenerated on Wed Mar 19 2025 03:04:38