new concatVectors call

release/4.3a0
Frank Dellaert 2009-12-18 06:11:19 +00:00
parent ac72d1cc22
commit bf504d30db
3 changed files with 37 additions and 22 deletions

View File

@ -238,31 +238,36 @@ namespace gtsam {
return make_pair(pseudo/precision, precision); return make_pair(pseudo/precision, precision);
} }
/* ************************************************************************* */
Vector concatVectors(const std::list<Vector>& vs)
{
int dim = 0;
BOOST_FOREACH(Vector v, vs)
dim += v.size();
Vector A(dim);
int index = 0;
BOOST_FOREACH(Vector v, vs) {
for(size_t d = 0; d < v.size(); d++)
A(d+index) = v(d);
index += v.size();
}
return A;
}
/* ************************************************************************* */ /* ************************************************************************* */
Vector concatVectors(size_t nrVectors, ...) Vector concatVectors(size_t nrVectors, ...)
{ {
int dimA = 0;
va_list ap; va_list ap;
list<Vector> vs;
va_start(ap, nrVectors); va_start(ap, nrVectors);
Vector* V; for( size_t i = 0 ; i < nrVectors ; i++) {
for( size_t i = 0 ; i < nrVectors ; i++) Vector* V = va_arg(ap, Vector*);
{ vs.push_back(*V);
V = va_arg(ap, Vector*);
dimA += V->size();
} }
va_end(ap); va_end(ap);
va_start(ap, nrVectors); return concatVectors(vs);
Vector A(dimA);
int index = 0;
for( size_t i = 0 ; i < nrVectors ; i++)
{
V = va_arg(ap, Vector *);
for(size_t d = 0; d < V->size(); d++)
A(d+index) = (*V)(d);
index += V->size();
}
return A;
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -9,6 +9,7 @@
#pragma once #pragma once
#include <list>
#include <boost/numeric/ublas/vector.hpp> #include <boost/numeric/ublas/vector.hpp>
#include <boost/random/linear_congruential.hpp> #include <boost/random/linear_congruential.hpp>
@ -167,8 +168,12 @@ std::pair<Vector, double> weightedPseudoinverse(const Vector& v, const Vector& s
/** /**
* concatenate Vectors * concatenate Vectors
*/ */
Vector concatVectors(size_t nrVectors, ...); Vector concatVectors(const std::list<Vector>& vs);
/**
* concatenate Vectors
*/
Vector concatVectors(size_t nrVectors, ...);
/** /**
* random vector * random vector

View File

@ -120,10 +120,15 @@ TEST( TestVector, concatVectors)
Vector C(7); Vector C(7);
for(int i = 0; i < 2; i++) C(i) = A(i); for(int i = 0; i < 2; i++) C(i) = A(i);
for(int i = 0; i < 5; i++) C(i+2) = B(i); for(int i = 0; i < 5; i++) C(i+2) = B(i);
Vector AB = concatVectors(2, &A, &B);
CHECK(AB == C); list<Vector> vs;
vs.push_back(A);
vs.push_back(B);
Vector AB1 = concatVectors(vs);
CHECK(AB1 == C);
Vector AB2 = concatVectors(2, &A, &B);
CHECK(AB2 == C);
} }
/* ************************************************************************* */ /* ************************************************************************* */