119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
|  | /* ----------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation,  | ||
|  |  * Atlanta, Georgia 30332-0415 | ||
|  |  * All Rights Reserved | ||
|  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | ||
|  | 
 | ||
|  |  * See LICENSE for the license information | ||
|  | 
 | ||
|  |  * -------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @file FixedVector.h | ||
|  |  * @brief Extension of boost's bounded_vector to allow for fixed size operation | ||
|  |  * @author Alex Cunningham | ||
|  |  */ | ||
|  | 
 | ||
|  | #pragma once
 | ||
|  | 
 | ||
|  | #include <stdarg.h>
 | ||
|  | #include <gtsam/base/Vector.h>
 | ||
|  | 
 | ||
|  | namespace gtsam { | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Fixed size vectors - compatible with boost vectors, but with compile-type | ||
|  |  * size checking. | ||
|  |  */ | ||
|  | template<size_t N> | ||
|  | class FixedVector : public Eigen::Matrix<double, N, 1> { | ||
|  | public: | ||
|  | 	typedef Eigen::Matrix<double, N, 1> Base; | ||
|  | 
 | ||
|  | 	/** default constructor */ | ||
|  | 	FixedVector() {} | ||
|  | 
 | ||
|  | 	/** copy constructors */ | ||
|  | 	FixedVector(const FixedVector& v) : Base(v) {} | ||
|  | 
 | ||
|  | 	/** Convert from a variable-size vector to a fixed size vector */ | ||
|  | 	FixedVector(const Vector& v) : Base(v) {} | ||
|  | 
 | ||
|  | 	/** Initialize with a C-style array */ | ||
|  | 	FixedVector(const double* values) { | ||
|  | 		std::copy(values, values+N, this->data()); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 *  nice constructor, dangerous as number of arguments must be exactly right | ||
|  | 	 *  and you have to pass doubles !!! always use 0.0 never 0 | ||
|  | 	 * | ||
|  | 	 *  NOTE: this will throw warnings/explode if there is no argument | ||
|  | 	 *  before the variadic section, so there is a meaningless size argument. | ||
|  | 	 */ | ||
|  | 	FixedVector(size_t n, ...) { | ||
|  | 	    va_list ap; | ||
|  | 	    va_start(ap, n); | ||
|  | 	    for(size_t i = 0 ; i < N ; i++) { | ||
|  | 	      double value = va_arg(ap, double); | ||
|  | 	      (*this)(i) = value; | ||
|  | 	    } | ||
|  | 	    va_end(ap); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * Create vector initialized to a constant value | ||
|  | 	 * @param constant value | ||
|  | 	 */ | ||
|  | 	inline static FixedVector repeat(double value) { | ||
|  | 		return FixedVector(Base::Constant(value)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * Create basis vector of | ||
|  | 	 * with a constant in spot i | ||
|  | 	 * @param index of the one | ||
|  | 	 * @param value is the value to insert into the vector | ||
|  | 	 * @return delta vector | ||
|  | 	 */ | ||
|  | 	inline static FixedVector delta(size_t i, double value) { | ||
|  | 		return FixedVector(Base::Unit(i) * value); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * Create basis vector, | ||
|  | 	 * with one in spot i | ||
|  | 	 * @param index of the one | ||
|  | 	 * @return basis vector | ||
|  | 	 */ | ||
|  | 	inline static FixedVector basis(size_t i) { return FixedVector(Base::Unit(i)); } | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * Create zero vector | ||
|  | 	 */ | ||
|  | 	inline static FixedVector zero() { return FixedVector(Base::Zero());} | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * Create vector initialized to ones | ||
|  | 	 */ | ||
|  | 	inline static FixedVector ones() { return FixedVector(FixedVector::Ones());} | ||
|  | 
 | ||
|  | 	static size_t dim() { return Base::max_size; } | ||
|  | 
 | ||
|  | 	void print(const std::string& name="") const { gtsam::print(Vector(*this), name); } | ||
|  | 
 | ||
|  | 	template<size_t M> | ||
|  | 	bool equals(const FixedVector<M>& other, double tol=1e-9) const { | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	bool equals(const FixedVector& other, double tol=1e-9) const { | ||
|  | 		return equal_with_abs_tol(*this,other,tol); | ||
|  | 	} | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | } // \namespace
 |