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>
75 fillOffsets(dimensions.begin(), dimensions.end(), appendOneDimension);
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>
95 matrix_.resize(matrix.rows(), matrix.cols());
97 fillOffsets(dimensions.begin(), dimensions.end(), appendOneDimension);
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_]; }
126 return calcIndices(block, block, 1, 1)[2];
148 return block_(J, J).diagonal();
161 return block_(I, I, J - I, J - I).selfadjointView<
Eigen::Upper>();
168 return block_(I, I, J - I, J - I).triangularView<
Eigen::Upper>();
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;
315 const DenseIndex actual_index = block + blockStart();
316 assert(actual_index < nOffsets());
317 return variableColOffsets_[actual_index];
323 const std::array<DenseIndex, 4> indices =
324 calcIndices(iBlock, jBlock, blockRows, blockCols);
325 return matrix_.block(indices[0], indices[1], indices[2], indices[3]);
331 const std::array<DenseIndex, 4> indices =
332 calcIndices(iBlock, jBlock, blockRows, blockCols);
333 return matrix_.block(indices[0], indices[1], indices[2], indices[3]);
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_);
Typedefs for easier changing of types.
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
constBlock full() const
Get the full matrix as a block.
m m block(1, 0, 2, 2)<< 4
void fillOffsets(ITERATOR firstBlockDim, ITERATOR lastBlockDim, bool appendOneDimension)
void setOffDiagonalBlock(DenseIndex I, DenseIndex J, const XprType &xpr)
Set an off-diagonal block. Only the upper triangular portion of xpr is evaluated. ...
FastVector< DenseIndex > variableColOffsets_
the starting columns of each block (0-based)
std::string serialize(const T &input)
serializes to a string
Eigen::Block< Matrix > Block
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.
Block full()
Get the full matrix as a block.
Matrix matrix_
The full matrix.
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
DenseIndex blockStart_
Changes apparent matrix view, see main class comment.
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
Block block_(DenseIndex iBlock, DenseIndex jBlock, DenseIndex blockRows=1, DenseIndex blockCols=1)
Get an arbitrary block from the matrix. Indices are in block units.
DenseIndex nActualBlocks() const
Number of actual blocks in the full matrix.
Eigen::SelfAdjointView< constBlock, Eigen::Upper > diagonalBlock(DenseIndex J) const
Return the J'th diagonal block as a self adjoint view.
DenseIndex blockStart() const
ptrdiff_t DenseIndex
The index type for Eigen objects.
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
SymmetricBlockMatrix(ITERATOR firstBlockDim, ITERATOR lastBlockDim, bool appendOneDimension=false)
Construct from iterator over the sizes of each vertical block.
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...
void split(const G &g, const PredecessorMap< KEY > &tree, G &Ab1, G &Ab2)
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Eigen::SelfAdjointView< constBlock, Eigen::Upper > selfadjointView(DenseIndex I, DenseIndex J) const
Return the square sub-matrix that contains blocks(i:j, i:j).
DenseIndex nBlocks() const
Block count.
DenseIndex rows() const
Row size.
void setDiagonalBlock(DenseIndex I, const XprType &xpr)
Set a diagonal block. Only the upper triangular portion of xpr is evaluated.
DenseIndex cols() const
Column size.
SymmetricBlockMatrix This
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.
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. ...
void updateDiagonalBlock(DenseIndex I, const XprType &xpr)
Increment the diagonal block by the values in xpr. Only reads the upper triangular part of xpr...
Expression of a selfadjoint matrix from a triangular part of a dense matrix.
JacobiRotation< float > J
Eigen::SelfAdjointView< Block, Eigen::Upper > selfadjointView()
Get self adjoint view.
void setFullMatrix(const XprType &xpr)
Set the entire active matrix. Only reads the upper triangular part of xpr.
A thin wrapper around std::vector that uses a custom allocator.
bool choleskyPartial(Matrix &ABC, size_t nFrontal, size_t topleft)
Expression of a fixed-size or dynamic-size block.
DenseIndex offset(DenseIndex block) const
Get an offset for a block index (in the active view).
Eigen::SelfAdjointView< constBlock, Eigen::Upper > selfadjointView() const
Get self adjoint view.
void setZero()
Set the entire active matrix zero.
Eigen::Block< const Matrix > constBlock
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.
Expression of a triangular part in a matrix.
Vector diagonal(DenseIndex J) const
Get the diagonal of the J'th diagonal block.
void updateOffDiagonalBlock(DenseIndex I, DenseIndex J, const XprType &xpr)
DenseIndex & blockStart()
Indicate Cholesky factorization failure.
Eigen::SelfAdjointView< Block, Eigen::Upper > diagonalBlock(DenseIndex J)
Return the J'th diagonal block as a self adjoint view.
void assertInvariants() const
DenseIndex getDim(DenseIndex block) const
Number of dimensions for variable on this diagonal block.
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
const std::vector< size_t > dimensions
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).
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.