Made vector templated on Key container.

release/4.3a0
Frank Dellaert 2018-09-30 10:28:45 -04:00
parent 65f307a823
commit e770490ae7
2 changed files with 20 additions and 23 deletions

View File

@ -160,28 +160,6 @@ namespace gtsam {
return result;
}
/* ************************************************************************* */
Vector VectorValues::vector(const FastVector<Key>& keys) const
{
// Count dimensions and collect pointers to avoid double lookups
DenseIndex totalDim = 0;
FastVector<const Vector*> items(keys.size());
for(size_t i = 0; i < keys.size(); ++i) {
items[i] = &at(keys[i]);
totalDim += items[i]->size();
}
// Copy vectors
Vector result(totalDim);
DenseIndex pos = 0;
for(const Vector *v: items) {
result.segment(pos, v->size()) = *v;
pos += v->size();
}
return result;
}
/* ************************************************************************* */
Vector VectorValues::vector(const Dims& keys) const
{

View File

@ -244,7 +244,26 @@ namespace gtsam {
Vector vector() const;
/** Access a vector that is a subset of relevant keys. */
Vector vector(const FastVector<Key>& keys) const;
template <typename CONTAINER>
Vector vector(const CONTAINER& keys) const {
DenseIndex totalDim = 0;
FastVector<const Vector*> items;
items.reserve(keys.end() - keys.begin());
for (Key key : keys) {
const Vector* v = &at(key);
totalDim += v->size();
items.push_back(v);
}
Vector result(totalDim);
DenseIndex pos = 0;
for (const Vector* v : items) {
result.segment(pos, v->size()) = *v;
pos += v->size();
}
return result;
}
/** Access a vector that is a subset of relevant keys, dims version. */
Vector vector(const Dims& dims) const;