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

@ -239,32 +239,37 @@ namespace gtsam {
}
/* ************************************************************************* */
Vector concatVectors(size_t nrVectors, ...)
Vector concatVectors(const std::list<Vector>& vs)
{
int dimA = 0;
va_list ap;
va_start(ap, nrVectors);
Vector* V;
for( size_t i = 0 ; i < nrVectors ; i++)
{
V = va_arg(ap, Vector*);
dimA += V->size();
}
va_end(ap);
va_start(ap, nrVectors);
Vector A(dimA);
int dim = 0;
BOOST_FOREACH(Vector v, vs)
dim += v.size();
Vector A(dim);
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();
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, ...)
{
va_list ap;
list<Vector> vs;
va_start(ap, nrVectors);
for( size_t i = 0 ; i < nrVectors ; i++) {
Vector* V = va_arg(ap, Vector*);
vs.push_back(*V);
}
va_end(ap);
return concatVectors(vs);
}
/* ************************************************************************* */
Vector rand_vector_norm(size_t dim, double mean, double sigma)
{

View File

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

View File

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