00001 //======================================================================= 00002 // Basic C++: a simple mathematical vector class 00003 // Implementation 00004 //----------------------------------------------------------------------- 00005 // Jean-Paul Rigault --- Copyright 2004 00006 // $Id: MVector.cpp,v 1.2 2004/11/28 16:50:16 jpr Exp $ 00007 //======================================================================= 00008 00009 #include "MVector.h" 00010 00017 MVector::MVector(int n, double x) 00018 : _ncomps(n), _components(n, x) 00019 { 00020 // Nothing else to do 00021 } 00022 00028 double MVector::norm() const 00029 { 00030 return *this * *this; 00031 } 00032 00033 00037 bool operator==(const MVector& mv1, const MVector& mv2) 00038 { 00039 if (mv1._ncomps != mv2._ncomps) return false; 00040 return mv1._components == mv2._components; 00041 } 00042 00046 MVector operator+(const MVector& mv1, const MVector& mv2) 00047 { 00048 if (mv1._ncomps != mv2._ncomps) throw MVector::Bad_Dimensions(); 00049 00050 int n = mv1._ncomps; 00051 MVector mv(n); 00052 for (int i = 0; i < n; ++i) 00053 mv._components[i] = mv1._components[i] + mv2._components[i]; 00054 return mv; 00055 } 00056 00060 MVector operator-(const MVector& mv1, const MVector& mv2) 00061 { 00062 if (mv1._ncomps != mv2._ncomps) throw MVector::Bad_Dimensions(); 00063 00064 int n = mv1._ncomps; 00065 MVector mv(n); 00066 for (int i = 0; i < n; ++i) 00067 mv._components[i] = mv1._components[i] - mv2._components[i]; 00068 return mv; 00069 } 00070 00074 double operator*(const MVector& mv1, const MVector& mv2) 00075 { 00076 if (mv1._ncomps != mv2._ncomps) throw MVector::Bad_Dimensions(); 00077 00078 int n = mv1._ncomps; 00079 double prod = 0.0; 00080 for (int i = 0; i < n; ++i) 00081 prod += mv1._components[i] * mv2._components[i]; 00082 return prod; 00083 } 00084 00085 double& MVector::operator[](int i) 00086 { 00087 if (i < 0 || i >= _ncomps) throw Out_Of_Bounds(); 00088 return _components[i]; 00089 } 00090 00091 double MVector::operator[](int i) const 00092 { 00093 if (i < 0 || i >= _ncomps) throw Out_Of_Bounds(); 00094 return _components[i]; 00095 } 00096 00100 ostream& operator<<(ostream& os, const MVector& mv) 00101 { 00102 os << "[ "; 00103 for (int i = 0; i < mv._ncomps; ++i) 00104 os << mv._components[i] << ' '; 00105 os << ']'; 00106 return os; 00107 }