Inlined VerticalBlockMatrix construction

release/4.3a0
dellaert 2014-10-12 11:05:43 +02:00
parent ed62271f81
commit fea2eb0b5f
1 changed files with 32 additions and 3 deletions

View File

@ -68,7 +68,7 @@ public:
// Evaluate error to get Jacobians and RHS vector b // Evaluate error to get Jacobians and RHS vector b
Augmented<T> augmented = expression_.augmented(x); Augmented<T> augmented = expression_.augmented(x);
Vector b = - measurement_.localCoordinates(augmented.value()); Vector b = -measurement_.localCoordinates(augmented.value());
// check(noiseModel_, b); // TODO: use, but defined in NonlinearFactor.cpp // check(noiseModel_, b); // TODO: use, but defined in NonlinearFactor.cpp
// Whiten the corresponding system now // Whiten the corresponding system now
@ -76,15 +76,44 @@ public:
// Terms, needed to create JacobianFactor below, are already here! // Terms, needed to create JacobianFactor below, are already here!
const JacobianMap& terms = augmented.jacobians(); const JacobianMap& terms = augmented.jacobians();
size_t n = terms.size();
// Get dimensions of matrices
std::vector<size_t> dimensions;
dimensions.reserve(n);
std::vector<Key> keys;
keys.reserve(n);
for (JacobianMap::const_iterator it = terms.begin(); it != terms.end();
++it) {
const std::pair<Key, Matrix>& term = *it;
Key key = term.first;
const Matrix& Ai = term.second;
dimensions.push_back(Ai.cols());
keys.push_back(key);
}
// Construct block matrix
VerticalBlockMatrix Ab(dimensions, b.size(), true);
// Check and add terms
DenseIndex i = 0; // For block index
for (JacobianMap::const_iterator it = terms.begin(); it != terms.end();
++it) {
const std::pair<Key, Matrix>& term = *it;
const Matrix& Ai = term.second;
Ab(i++) = Ai;
}
Ab(n).col(0) = b;
// TODO pass unwhitened + noise model to Gaussian factor // TODO pass unwhitened + noise model to Gaussian factor
// For now, only linearized constrained factors have noise model at linear level!!! // For now, only linearized constrained factors have noise model at linear level!!!
noiseModel::Constrained::shared_ptr constrained = // noiseModel::Constrained::shared_ptr constrained = //
boost::dynamic_pointer_cast<noiseModel::Constrained>(this->noiseModel_); boost::dynamic_pointer_cast<noiseModel::Constrained>(this->noiseModel_);
if (constrained) { if (constrained) {
return boost::make_shared<JacobianFactor>(terms, b, constrained->unit()); return boost::make_shared<JacobianFactor>(keys, Ab, constrained->unit());
} else } else
return boost::make_shared<JacobianFactor>(terms, b); return boost::make_shared<JacobianFactor>(keys, Ab);
} }
}; };
// ExpressionFactor // ExpressionFactor