00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #pragma once
00060 #ifndef VECTOR_H
00061 #define VECTOR_H
00062
00063 #include <iostream>
00064
00065 using std::cout;
00066 using std::cerr;
00067 using std::endl;
00068 using std::ostream;
00069 using std::right;
00070 using std::fixed;
00071
00072 #include <iomanip>
00073
00074 using std::setw;
00075
00076 #include <math.h>
00077
00078 #include <typeinfo>
00079
00080 #include "./Cleaner.h"
00081 #include "./Utility.h"
00082 #include "./Array.h"
00083 #include "./Matrix.h"
00084 #include "./RandomGen.h"
00085
00086
00087
00088
00089
00090 template< class T > class Array;
00091 template< class T > class Matrix;
00092 template< class T > class Vector;
00093 template< class T, int l > class List;
00094 template< class T > class VarList;
00095
00097 template< class T >
00098 class Vector
00099 {
00100 friend class Array<T>;
00101 friend class Matrix<T>;
00102
00103
00104 protected:
00105 T *data;
00106 int length;
00107 bool memoryManaged;
00108 Cleaner<T> *clean;
00109
00110
00111 public:
00112 Vector(void);
00113 explicit Vector(int l);
00114 Vector(int l, T init);
00115 Vector(T* _data, int l);
00116 Vector(Vector<T> &v);
00117
00118 ~Vector(void);
00119 void Set(T* _data, const int l);
00120
00121 void Clean();
00122
00123 const T* DataPtr() const;
00124 T* Data();
00125
00126 Vector<T> Clone() const;
00127 Vector<T> Slice(int start, int end);
00128
00129 const bool IsMemoryManaged() const;
00130
00131 const int Length() const;
00132 void Init(const T init);
00133 Vector<T>& Rand();
00134 Vector<T>& Rand(const double max);
00135 static Vector<T> Rand(const int l);
00136 static Vector<T> Rand(const int l, const double max);
00137
00138 static T Inner(Vector<T>& m1, Vector<T>& m2);
00139
00140
00141 static Vector<int> And(Vector<T>& m1, Vector<T>& m2);
00142 static Vector<int> Or(Vector<T>& m1, Vector<T>& m2);
00143 static Vector<int> Lt(Vector<T>& m1, Vector<T>& m2);
00144 static Vector<int> Gt(Vector<T>& m1, Vector<T>& m2);
00145 static Vector<int> Le(Vector<T>& m1, Vector<T>& m2);
00146 static Vector<int> Ge(Vector<T>& m1, Vector<T>& m2);
00147 static Vector<int> Eq(Vector<T>& m1, Vector<T>& m2);
00148 static Vector<int> Ne(Vector<T>& m1, Vector<T>& m2);
00149
00150
00151 static Vector<int> And(Vector<T>& m, T v);
00152 static Vector<int> Or(Vector<T>& m, T v);
00153 static Vector<int> Lt(Vector<T>& m, T v);
00154 static Vector<int> Gt(Vector<T>& m, T v);
00155 static Vector<int> Le(Vector<T>& m, T v);
00156 static Vector<int> Ge(Vector<T>& m, T v);
00157 static Vector<int> Eq(Vector<T>& m, T v);
00158 static Vector<int> Ne(Vector<T>& m, T v);
00159
00160
00161
00162
00163 static Vector<T> Add(Vector<T>& m1, Vector<T>& m2);
00164 static Vector<T> Subtract(Vector<T>& m1, Vector<T>& m2);
00165 static Vector<T> Multiply(Vector<T>& m1, Vector<T>& m2);
00166 static Vector<T> Divide(Vector<T>& m1, Vector<T>& m2);
00167
00168
00169 static Vector<T> Add(Vector<T>& m1, T v2);
00170 static Vector<T> Subtract(Vector<T>& m1, T v2);
00171 static Vector<T> Subtract(T v2, Vector<T>& m1);
00172 static Vector<T> Multiply(Vector<T>& m1, T v2);
00173 static Vector<T> Divide(Vector<T>& m1, T v2);
00174 static Vector<T> Divide(T v2, Vector<T>& m1);
00175
00176
00177
00178 Vector<T>& Add(Vector<T>& m);
00179 Vector<T>& Subtract(Vector<T>& m);
00180 Vector<T>& Multiply(Vector<T>& m);
00181 Vector<T>& Divide(Vector<T>& m);
00182
00183
00184 Vector<T>& Add(T v);
00185 Vector<T>& Subtract(T v);
00186 Vector<T>& Multiply(T v);
00187 Vector<T>& Divide(T v);
00188
00189
00190
00191 Vector<T>& operator= (Vector<T>& m);
00192 Vector<T>& operator= (Matrix<T>& m);
00193 Vector<T>& operator= (Array<T>& m);
00194
00195 Vector<T> operator+ ();
00196 Vector<T> operator- ();
00197 Vector<int> operator! ();
00198
00199 friend ostream& operator<< (ostream& output, const Vector<T>& v)
00200 {
00201 int lm = v.Length();
00202 int rowNoWidth = (int)log10((double)(lm-1))+2;
00203 int maxLength = 1;
00204 for(int i=0; i<v.Length(); i++)
00205 {
00206 ostringstream oS;
00207 oS << v.data[i];
00208 int l = (int)oS.str().length();
00209 if(l>maxLength)
00210 {
00211 maxLength = l;
00212 }
00213 }
00214
00215 output << typeid(v).name() << " of size " << v.length << endl;
00216 output << "----------------------" << endl;
00217 for(int i=0;i<v.length;i++)
00218 {
00219 output << "ROW" << setw(rowNoWidth) << i+1 << "|" << right << setw(maxLength+3) << v.data[i] << " |" << endl;
00220 }
00221 output << "----------------------" << endl;
00222 output << endl;
00223 return output;
00224 }
00225
00226
00227 T& operator() (const int i);
00228 T& operator[] (const int i);
00229
00230
00231 Vector<T> operator() (int start, int end);
00232
00233 T& Elem(const int i);
00234 T& ElemNC(const int i);
00235
00236
00237
00238 friend T operator& (Vector<T>& m1, Vector<T>& m2)
00239 {
00240 return Vector<T>::Inner(m1, m2);
00241 }
00242
00243
00244
00245 friend Vector<int> operator&& (Vector<T>& m1, Vector<T>& m2)
00246 {
00247 return Vector<T>::And(m1, m2);
00248 }
00249
00250 friend Vector<int> operator|| (Vector<T>& m1, Vector<T>& m2)
00251 {
00252 return Vector<T>::Or(m1, m2);
00253 }
00254
00255 friend Vector<int> operator< (Vector<T>& m1, Vector<T>& m2)
00256 {
00257 return Vector<T>::Lt(m1, m2);
00258 }
00259
00260 friend Vector<int> operator> (Vector<T>& m1, Vector<T>& m2)
00261 {
00262 return Vector<T>::Gt(m1, m2);
00263 }
00264
00265 friend Vector<int> operator<= (Vector<T>& m1, Vector<T>& m2)
00266 {
00267 return Vector<T>::Le(m1, m2);
00268 }
00269
00270 friend Vector<int> operator>= (Vector<T>& m1, Vector<T>& m2)
00271 {
00272 return Vector<T>::Ge(m1, m2);
00273 }
00274
00275 friend Vector<int> operator== (Vector<T>& m1, Vector<T>& m2)
00276 {
00277 return Vector<T>::Eq(m1, m2);
00278 }
00279
00280 friend Vector<int> operator!= (Vector<T>& m1, Vector<T>& m2)
00281 {
00282 return Vector<T>::Ne(m1, m2);
00283 }
00284
00285
00286
00287 friend Vector<int> operator&& (Vector<T>& m, T v)
00288 {
00289 return Vector<T>::And(m, v);
00290 }
00291 friend Vector<int> operator&& (T v, Vector<T>& m)
00292 {
00293 return Vector<T>::And(m, v);
00294 }
00295
00296 friend Vector<int> operator|| (Vector<T>& m, T v)
00297 {
00298 return Vector<T>::Or(m, v);
00299 }
00300 friend Vector<int> operator|| (T v, Vector<T>& m)
00301 {
00302 return Vector<T>::Or(m, v);
00303 }
00304
00305 friend Vector<int> operator< (Vector<T>& m, T v)
00306 {
00307 return Vector<T>::Lt(m, v);
00308 }
00309 friend Vector<int> operator< (T v, Vector<T>& m)
00310 {
00311 return Vector<T>::Gt(m, v);
00312 }
00313
00314 friend Vector<int> operator> (Vector<T>& m, T v)
00315 {
00316 return Vector<T>::Gt(m, v);
00317 }
00318 friend Vector<int> operator> (T v, Vector<T>& m)
00319 {
00320 return Vector<T>::Lt(m, v);
00321 }
00322
00323 friend Vector<int> operator<= (Vector<T>& m, T v)
00324 {
00325 return Vector<T>::Le(m, v);
00326 }
00327 friend Vector<int> operator<= (T v, Vector<T>& m)
00328 {
00329 return Vector<T>::Ge(m, v);
00330 }
00331
00332 friend Vector<int> operator>= (Vector<T>& m, T v)
00333 {
00334 return Vector<T>::Ge(m, v);
00335 }
00336 friend Vector<int> operator>= (T v, Vector<T>& m)
00337 {
00338 return Vector<T>::Le(m, v);
00339 }
00340
00341 friend Vector<int> operator== (Vector<T>& m, T v)
00342 {
00343 return Vector<T>::Eq(m, v);
00344 }
00345 friend Vector<int> operator== (T v, Vector<T>& m)
00346 {
00347 return Vector<T>::Eq(m, v);
00348 }
00349
00350 friend Vector<int> operator!= (Vector<T>& m, T v)
00351 {
00352 return Vector<T>::Ne(m, v);
00353 }
00354 friend Vector<int> operator!= (T v, Vector<T>& m)
00355 {
00356 return Vector<T>::Ne(m, v);
00357 }
00358
00359
00360
00361
00362 friend Vector<T> operator+ (Vector<T>& m1, Vector<T>& m2)
00363 {
00364 return Vector<T>::Add(m1, m2);
00365 }
00366
00367 friend Vector<T> operator- (Vector<T>& m1, Vector<T>& m2)
00368 {
00369 return Vector<T>::Subtract(m1, m2);
00370 }
00371
00372 friend Vector<T> operator* (Vector<T>& m1, Vector<T>& m2)
00373 {
00374 return Vector<T>::Multiply(m1, m2);
00375 }
00376
00377 friend Vector<T> operator/ (Vector<T>& m1, Vector<T>& m2)
00378 {
00379 return Vector<T>::Divide(m1, m2);
00380 }
00381
00382
00383
00384 friend Vector<T> operator+ (Vector<T>& m, T v)
00385 {
00386 return Vector<T>::Add(m, v);
00387 }
00388
00389 friend Vector<T> operator+ (T v, Vector<T>& m)
00390 {
00391 return Vector<T>::Add(m, v);
00392 }
00393
00394 friend Vector<T> operator- (Vector<T>& m, T v)
00395 {
00396 return Vector<T>::Subtract(m, v);
00397 }
00398
00399 friend Vector<T> operator- (T v, Vector<T>& m)
00400 {
00401 return Vector<T>::Subtract(v, m);
00402 }
00403
00404 friend Vector<T> operator* (Vector<T>& m, T v)
00405 {
00406 return Vector<T>::Multiply(m, v);
00407 }
00408
00409 friend Vector<T> operator* (T v, Vector<T>& m)
00410 {
00411 return Vector<T>::Multiply(m, v);
00412 }
00413
00414 friend Vector<T> operator/ (Vector<T>& m, T v)
00415 {
00416 return Vector<T>::Divide(m, v);
00417 }
00418
00419 friend Vector<T> operator/ (T v, Vector<T>& m)
00420 {
00421 return Vector<T>::Divide(v, m);
00422 }
00423
00424
00425
00426
00427
00428 Vector<T>& operator+= (Vector<T>& m);
00429 Vector<T>& operator-= (Vector<T>& m);
00430 Vector<T>& operator*= (Vector<T>& m);
00431 Vector<T>& operator/= (Vector<T>& m);
00432
00433 Vector<T>& operator+= (T v);
00434 Vector<T>& operator-= (T v);
00435 Vector<T>& operator*= (T v);
00436 Vector<T>& operator/= (T v);
00437
00438
00439
00440 Vector(Array<T> &m);
00441 Vector(Matrix<T> &m);
00442
00443 };
00444
00445
00446
00447
00448 #include "./Vector.inl"
00449
00450
00451
00452
00453
00454
00455 #endif
00456
00457
00458
00459
00460
00461
00462
CIMPL 0.1 Code Reference.
Copyright © 2004, Baris Sumengen. All rights reserved.