Go to the documentation of this file.
23 #include <gtsam/dllexport.h>
24 #ifdef 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>();
268 void invertInPlace();
304 return variableColOffsets_.size();
309 return nOffsets() - 1;
316 assert(actual_index < nOffsets());
317 return variableColOffsets_[actual_index];
323 const std::array<DenseIndex, 4>
indices =
324 calcIndices(iBlock, jBlock, blockRows, blockCols);
331 const std::array<DenseIndex, 4>
indices =
332 calcIndices(iBlock, jBlock, blockRows, blockCols);
338 return block_(0, 0, nBlocks(), nBlocks());
343 return block_(0, 0, nBlocks(), nBlocks());
350 assert(blockRows >= 0);
351 assert(blockCols >= 0);
358 return {{denseI, denseJ, denseRows, denseCols}};
363 assert(matrix_.rows() == matrix_.cols());
364 assert(matrix_.cols() == variableColOffsets_.back());
365 assert(blockStart_ < (
DenseIndex)variableColOffsets_.size());
368 template<
typename ITERATOR>
369 void fillOffsets(ITERATOR firstBlockDim, ITERATOR lastBlockDim,
bool appendOneDimension)
371 variableColOffsets_.resize((lastBlockDim-firstBlockDim) + 1 + (appendOneDimension ? 1 : 0));
372 variableColOffsets_[0] = 0;
374 for(ITERATOR dim=firstBlockDim; dim!=lastBlockDim; ++dim) {
375 variableColOffsets_[
j+1] = variableColOffsets_[
j] + *dim;
378 if(appendOneDimension)
380 variableColOffsets_[
j+1] = variableColOffsets_[
j] + 1;
386 template<
typename SymmetricBlockMatrixType>
friend class SymmetricBlockMatrixBlockExpr;
389 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
391 friend class boost::serialization::access;
392 template<
class ARCHIVE>
393 void serialize(ARCHIVE & ar,
const unsigned int ) {
398 ar & BOOST_SERIALIZATION_NVP(matrix_);
399 ar & BOOST_SERIALIZATION_NVP(variableColOffsets_);
400 ar & BOOST_SERIALIZATION_NVP(blockStart_);
406 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 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 Sat Nov 16 2024 04:05:22