29 class SymmetricBlockMatrix;
62 variableColOffsets_.push_back(0);
76 : matrix_(std::move(
other.matrix_)),
77 variableColOffsets_(std::move(
other.variableColOffsets_)),
78 rowStart_(
other.rowStart_),
79 rowEnd_(
other.rowEnd_),
80 blockStart_(
other.blockStart_) {
83 other.blockStart_ = 0;
89 matrix_ = std::move(
other.matrix_);
90 variableColOffsets_ = std::move(
other.variableColOffsets_);
91 rowStart_ =
other.rowStart_;
92 rowEnd_ =
other.rowEnd_;
93 blockStart_ =
other.blockStart_;
97 other.blockStart_ = 0;
103 template<
typename CONTAINER>
105 bool appendOneDimension =
false) :
106 variableColOffsets_(
dimensions.
size() + (appendOneDimension ? 2 : 1)),
107 rowStart_(0), rowEnd_(height), blockStart_(0) {
109 matrix_.resize(height, variableColOffsets_.back());
114 template<
typename CONTAINER,
typename DERIVED>
118 rowStart_(0), rowEnd_(
matrix.
rows()), blockStart_(0) {
120 if (variableColOffsets_.back() != matrix_.cols())
121 throw std::invalid_argument(
122 "Requested to create a VerticalBlockMatrix with dimensions that do not sum to the total columns of the provided matrix.");
127 template<
typename ITERATOR>
129 DenseIndex height,
bool appendOneDimension =
false) :
130 variableColOffsets_((lastBlockDim-firstBlockDim) + (appendOneDimension ? 2 : 1)),
131 rowStart_(0), rowEnd_(height), blockStart_(0) {
132 fillOffsets(firstBlockDim, lastBlockDim, appendOneDimension);
133 matrix_.resize(height, variableColOffsets_.back());
153 DenseIndex cols()
const { assertInvariants();
return variableColOffsets_.back() - variableColOffsets_[blockStart_]; }
156 DenseIndex nBlocks()
const { assertInvariants();
return variableColOffsets_.size() - 1 - blockStart_; }
167 DenseIndex actualStartBlock = startBlock + blockStart_;
168 DenseIndex actualEndBlock = endBlock + blockStart_;
169 if(startBlock != 0 || endBlock != 0) {
170 checkBlock(actualStartBlock);
171 assert(actualEndBlock < (
DenseIndex)variableColOffsets_.size());
173 const DenseIndex startCol = variableColOffsets_[actualStartBlock];
174 const DenseIndex rangeCols = variableColOffsets_[actualEndBlock] - startCol;
175 return matrix_.block(rowStart_, startCol, this->
rows(), rangeCols);
180 DenseIndex actualStartBlock = startBlock + blockStart_;
181 DenseIndex actualEndBlock = endBlock + blockStart_;
182 if(startBlock != 0 || endBlock != 0) {
183 checkBlock(actualStartBlock);
184 assert(actualEndBlock < (
DenseIndex)variableColOffsets_.size());
186 const DenseIndex startCol = variableColOffsets_[actualStartBlock];
187 const DenseIndex rangeCols = variableColOffsets_[actualEndBlock] - startCol;
188 return ((
const Matrix&)matrix_).block(rowStart_, startCol, this->
rows(), rangeCols);
200 checkBlock(actualBlock);
201 return variableColOffsets_[actualBlock];
230 assert(matrix_.cols() == variableColOffsets_.back());
231 assert(blockStart_ < (
DenseIndex)variableColOffsets_.size());
232 assert(rowStart_ <= matrix_.rows());
233 assert(rowEnd_ <= matrix_.rows());
234 assert(rowStart_ <= rowEnd_);
238 static_cast<void>(
block);
239 assert(matrix_.cols() == variableColOffsets_.back());
241 assert(variableColOffsets_[
block] < matrix_.cols() && variableColOffsets_[
block+1] <= matrix_.cols());
244 template<
typename ITERATOR>
245 void fillOffsets(ITERATOR firstBlockDim, ITERATOR lastBlockDim,
bool appendOneDimension) {
246 variableColOffsets_[0] = 0;
248 for(ITERATOR dim=firstBlockDim; dim!=lastBlockDim; ++dim, ++
j)
249 variableColOffsets_[
j+1] = variableColOffsets_[
j] + *dim;
250 if(appendOneDimension)
251 variableColOffsets_[
j+1] = variableColOffsets_[
j] + 1;
257 #if GTSAM_ENABLE_BOOST_SERIALIZATION
259 friend class boost::serialization::access;
260 template<
class ARCHIVE>
261 void serialize(ARCHIVE & ar,
const unsigned int ) {
262 ar & BOOST_SERIALIZATION_NVP(matrix_);
263 ar & BOOST_SERIALIZATION_NVP(variableColOffsets_);
264 ar & BOOST_SERIALIZATION_NVP(rowStart_);
265 ar & BOOST_SERIALIZATION_NVP(rowEnd_);
266 ar & BOOST_SERIALIZATION_NVP(blockStart_);