1 #ifndef CARMA_SERVICES_VECTOR_H
2 #define CARMA_SERVICES_VECTOR_H
30 const Vector<type>& vec);
32 std::ostringstream&
operator<<(std::ostringstream& os,
33 const Vector<type>& vec);
51 Vector(
unsigned n, type initializer);
56 Vector(type el0, type el1, type el2);
61 Vector(
const Vector<type>& vec);
139 friend std::ostream& carma::services::operator << <>
145 friend std::ostringstream& carma::services::operator << <>
165 std::vector<type> data_;
218 : data_(n, initializer)
230 nEl_ = vec.data_.size();
258 template <
class type>
263 for(
unsigned iel=0; iel < data_.size(); iel++)
264 sum += data_[iel]*data_[iel];
269 template <
class type>
272 unsigned dsize = data_.size();
273 unsigned vsize = vec.data_.size();
274 if(dsize ==0 || vsize ==0) {
276 "Vector::cross - Vector has zero size.");
279 if( dsize != vsize ) {
281 "Vector::cross - Vectors must have the same size");
291 product.data_[0] = 0.0;
292 product.data_[1] = 0.0;
293 product.data_[2] = data_[0]*vec.data_[1]
294 - data_[1]*vec.data_[0];
297 product.data_[0] = data_[1]*vec.data_[2]
298 - data_[2]*vec.data_[1];
299 product.data_[1] = data_[2]*vec.data_[0]
300 - data_[0]*vec.data_[2];
301 product.data_[2] = data_[0]*vec.data_[1]
302 - data_[1]*vec.data_[0];
308 "Vector::cross - Cross product defined only for 2 and 3 dimensions"
320 if(i > data_.size()-1) {
321 std::ostringstream os;
322 os <<
"Vector::operator[] - Vector has no element: " << i;
332 if(i > data_.size()-1) {
333 std::ostringstream os;
334 os <<
"Vector::operator[] - Vector has no element: " << i;
347 if(data_.size()==0 || vec.data_.size()==0) {
349 "Vector::operator* : Received vector size of zero");
352 if( data_.size() != vec.data_.size() ) {
354 "Vector::operator* : Vectors must have the same size");
357 type sum = data_[0] * vec.data_[0];
359 for(
unsigned i=1; i < data_.size(); i++)
360 sum += data_[i] * vec.data_[i];
373 if(data_.size()==0 || vec.data_.size()==0) {
375 "Vector::operator+ : Received vector size of zero"
379 if(data_.size() != vec.data_.size()) {
381 "Vector::operator+ : Vectors must have the same size"
387 for(
unsigned i=0; i < data_.size(); i++)
388 result.data_[i] = (data_[i] + vec.data_[i]);
400 if(nEl_==0 || vec.nEl_==0) {
402 "Vector::operator- : Received vector size of zero"
406 if(nEl_ != vec.nEl_) {
408 "Vector::operator- : Vectors must have the same size"
414 for(
unsigned i=0; i < nEl_; i++)
415 result.data_[i] = (data_[i] - vec.data_[i]);
429 "Vector::operator*(scalar) : Vector has zero size."
435 for(
unsigned i=0; i < nEl_; i++)
436 result.data_[i] = (data_[i] * factor);
450 "Vector::operator/(scalar) : Vector has zero size."
456 for(
unsigned i=0; i < nEl_; i++)
457 result.data_[i] = (data_[i] / factor);
471 "Vector::operator+(scalar) : Vector has zero size."
477 for(
unsigned i=0; i < nEl_; i++)
478 result.data_[i] = (data_[i] + offset);
492 "Vector::operator-(scalar) : Vector has zero size."
498 for(
unsigned i=0; i < nEl_; i++)
499 result.data_[i] = (data_[i] - offset);
507 template <
class type>
512 for(
unsigned i=0; i < vec.data_.size(); i++) {
515 os << ::std::setw(18) << ::std::setprecision(12) << vec.data_[i];
524 template <
class type>
529 for(
unsigned i=0; i < vec.data_.size(); i++) {
532 os << ::std::setw(18) << ::std::setprecision(12) << vec.data_[i];
541 #endif // End #ifndef CARMA_SERVICES_VECTOR_H
virtual ~Vector()
Destructor.
This class handles standard mathematical vector operations.
Exception class for errors.
const type operator*(const Vector< type > &vec)
Vector multiplication, aka dot product.
unsigned nEl_
Store the length.
Vector()
Private constructor with no arguments.
const Vector< type > operator/(const type factor)
......................................................................
const Vector< type > cross(const Vector< type > &vec)
Assignment void operator=(const Vector<type>& vec);.
This class handles standard mathematical matrix operations.
unsigned size() const
Query the size of the vector.
Exception class for errors The exception comes with a text string that can be printed or logged...
const Vector< type > operator-(const Vector< type > &vec)
......................................................................
#define CARMA_EXCEPTION(x, y)
Trick to get the file name and line number passed to the exception handler.
std::ostream & operator<<(std::ostream &os, const carma::services::Angle &angle)
Define the << operator to allow, e.g.
void resize(unsigned n)
Private resize operator.
double magnitude()
Get the magnitude of a vector.
type & operator[](unsigned i)
Define an operator for accessing elements of the vector.
const Vector< type > operator+(const Vector< type > &vec)
Vector addition.