From bf504d30db3315027b2dd6f13eb52a1c1a1db651 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 18 Dec 2009 06:11:19 +0000 Subject: [PATCH] new concatVectors call --- cpp/Vector.cpp | 41 +++++++++++++++++++++++------------------ cpp/Vector.h | 7 ++++++- cpp/testVector.cpp | 11 ++++++++--- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/cpp/Vector.cpp b/cpp/Vector.cpp index 79a7bf383..c98a5aa0a 100644 --- a/cpp/Vector.cpp +++ b/cpp/Vector.cpp @@ -238,31 +238,36 @@ namespace gtsam { return make_pair(pseudo/precision, precision); } + /* ************************************************************************* */ + Vector concatVectors(const std::list& 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, ...) { - int dimA = 0; va_list ap; + list vs; va_start(ap, nrVectors); - Vector* V; - for( size_t i = 0 ; i < nrVectors ; i++) - { - V = va_arg(ap, Vector*); - dimA += V->size(); + for( size_t i = 0 ; i < nrVectors ; i++) { + Vector* V = va_arg(ap, Vector*); + vs.push_back(*V); } va_end(ap); - va_start(ap, nrVectors); - 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; + return concatVectors(vs); } /* ************************************************************************* */ diff --git a/cpp/Vector.h b/cpp/Vector.h index 29899942c..fa93d1ae0 100644 --- a/cpp/Vector.h +++ b/cpp/Vector.h @@ -9,6 +9,7 @@ #pragma once +#include #include #include @@ -167,8 +168,12 @@ std::pair weightedPseudoinverse(const Vector& v, const Vector& s /** * concatenate Vectors */ -Vector concatVectors(size_t nrVectors, ...); +Vector concatVectors(const std::list& vs); +/** + * concatenate Vectors + */ +Vector concatVectors(size_t nrVectors, ...); /** * random vector diff --git a/cpp/testVector.cpp b/cpp/testVector.cpp index 7035d0f20..fb19c2966 100644 --- a/cpp/testVector.cpp +++ b/cpp/testVector.cpp @@ -120,10 +120,15 @@ TEST( TestVector, concatVectors) Vector C(7); 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); - CHECK(AB == C); + list 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); } /* ************************************************************************* */