nmpp
tvector.h
1//------------------------------------------------------------------------
2//
3// $Workfile:: tVector. $
4//
5// Векторно-матричная библиотека
6//
7// Copyright (c) RC Module Inc.
8//
9// $Revision: 1.7 $ $Date: 2005/06/29 14:14:06 $
10//
19//------------------------------------------------------------------------
20#ifndef _TVECTOR_H_INCLUDED_
21#define _TVECTOR_H_INCLUDED_
22
23#ifdef ENABLE_ASSERTE
24#include <crtdbg.h>
25#define ASSERTE _ASSERTE
26#else
27#define ASSERTE(expression)
28#endif
29
30
31#include<string.h>
32#include "nmtype.h"
33#include <math.h>
34
35
36
37
38
39template <class T> class mtr;
40
41
42//#include "tMatrix.h"
43
44//*****************************************************************************
75//*****************************************************************************
76
77//void* allocate()
78
79template<class T> class vec
80{
81protected:
82 T* m_container;
83public:
84 int m_border;
85 int size;
86 T *m_data;
87
88 explicit vec()
89 {
90 size=0;
91 m_border=0;
92 m_container=0;
93 m_data=0;
94 }
95
96 void resize(int Size, int Border=0)
97 {
98 if (m_container)
99 delete []m_container;
100 size=Size;
101 m_border=Border;
102 m_container=new T[size+2*m_border];
103 m_data=m_container+m_border;
104 }
105
106 explicit vec(T * Data, int Size, int Border=0):m_data(Data),size(Size),m_border(Border),m_container(0)
107 {
108
109 };
110
111 explicit vec(int Size, int Border=0)
112 {
113 size=Size;
114 m_border=Border;
115 m_container=new T[size+2*m_border];
116 m_data=m_container+m_border;
117 }
118
119 /*explicit*/ vec(const vec<T> &vect)
120 {
121 m_border=vect.m_border;
122 size =vect.size;
123 m_container=new T[size+2*m_border];
124 m_data=m_container+m_border;
125 for (int idx=0;idx<size;idx++)
126 m_data[idx]=vect.m_data[idx];
127 };
128/*
129 template<class T2> explicit vec(const vec<T2> &vect)
130 {
131 m_border=vect.m_border;
132 size =vect.size;
133 m_container=new T[size+2*m_border];
134 m_data=m_container+m_border;
135 for (int idx=0;idx<size;idx++)
136 m_data[idx]=vect.m_data[idx];
137 };
138
139*/
140 ~vec()
141 {
142 if (m_container)
143 delete []m_container;
144 }
145
146 void reset()
147 {
148 ASSERTE(m_container);
149 if (m_container)
150 memset(m_container,0,(size+2*m_border)*sizeof(T));
151 else
152 memset(m_data,0,size*sizeof(T));
153 }
154
155 vec<T>& InitRamp(T StartValue, T Increment)
156 {
157 m_data[0]=StartValue;
158 for(int i=1; i<size; i++){
159 m_data[i]=m_data[i-1]+Increment;
160 }
161 return *this;
162 }
163
164 int MaxPos(T& maxval)
165 {
166 maxval=m_data[0];
167 int maxpos=0;
168 for(int i=1; i<size; i++) {
169 if (maxval<m_data[i]){
170 maxpos=i;
171 maxval=m_data[i];
172 }
173 }
174 return maxpos;
175 }
176 int MinPos(T& minval)
177 {
178 minval=m_data[0];
179 int minpos=0;
180 for(int i=1; i<size; i++) {
181 if (minval>m_data[i]){
182 minpos=i;
183 minval=m_data[i];
184 }
185 }
186 return minpos;
187 }
188
189 double Mean()
190 {
191 T Res=m_data[0];
192 for(int i=1; i<size; i++) {
193 Res+=m_data[i];
194 }
195 return double(Res)/size;
196 }
197
198 T& CustomMax()
199 {
200 T max=m_data[0];
201 //int maxpos=0;
202 for(int i=1; i<size; i++) {
203 max = tCustomMax(max,m_data[i]);
204 }
205 return max;
206 }
207 vec<T>& operator= (const T& val)
208 {
209 for(int idx=0;idx<size;idx++)
210 m_data[idx]=val;
211 return *this;
212 }
213
214 vec<T>& operator= (const vec<T>& vect)
215 {
216 ASSERTE(vect.size==size);
217 for(int idx=0;idx<size;idx++)
218 m_data[idx]=vect.m_data[idx];
219 return *this;
220 }
221
222 inline T* addr(int idx)
223 {
224 ASSERTE(idx>=-m_border);
225 ASSERTE(idx<size+m_border);
226 return m_data+idx;
227 }
228
229 inline T& operator [] (size_t idx)
230 {
231 ASSERTE(idx>=-m_border);
232 ASSERTE(idx<size+m_border);
233 T* res=(T*)(m_data+idx);
234 return *res;
235 }
236
237 vec<T>& operator*= (const T& val)
238 {
239 for(int idx=0;idx<size;idx++)
240 m_data[idx]*=val;
241 return (*this);
242 }
243
244 vec<T> operator* (const T& val) const
245 {
246 vec<T> res(size);
247 for(int idx=0;idx<size;idx++)
248 res.m_data[idx]=m_data[idx]*val;
249 return res;
250 }
251
252 T operator* (const vec<T>& vect) const
253 {
254 ASSERTE(size==vect.size);
255 T res=0;
256 for (int idx=0;idx<size;idx++)
257 res+=m_data[idx]*vect.m_data[idx];
258 return res;
259 }
260
261 vec<T> operator* (const mtr<T> matr) const
262 {
263 ASSERTE(size==matr.m_height);
264 vec<T> res(matr.m_width);
265 for(int i=0; i<matr.m_width; i++){
266 T sum=matr[0][i]*m_data[0];
267 for(int j=1; j<matr.m_height; j++){
268 sum+=matr[j][i]*m_data[j];
269 }
270 res[i]=sum;
271 }
272 return res;
273 }
274 vec<T>& operator+= (const T &val)
275 {
276 for(int idx=0;idx<size;idx++)
277 m_data[idx]+=val;
278 return (*this);
279 }
280
281 vec<T>& operator+= (const vec<T> &vect)
282 {
283 ASSERTE (vect.size==size);
284 for(int idx=0;idx<size;idx++)
285 m_data[idx]+=vect.m_data[idx];
286 return (*this);
287 }
288
289 vec<T> operator+ (const T& val) const
290 {
291 vec<T> res(*this);
292 res+=val;
293 return res;
294 }
295
296 vec<T> operator+ (const vec<T>& vect) const
297 {
298 ASSERTE (vect.size==size);
299 vec<T> res(*this);
300 res+=vect;
301 return res;
302 }
303
304 vec<T>& operator-= (const T &val)
305 {
306 for(int idx=0;idx<size;idx++)
307 m_data[idx]-=val;
308 return (*this);
309 }
310
311 vec<T>& operator-= (const vec<T> &vect)
312 {
313 ASSERTE (vect.size==size);
314 for(int idx=0;idx<size;idx++)
315 m_data[idx]-=vect.m_data[idx];
316 return (*this);
317 }
318
319 vec<T> operator- (const vec<T>& vect) const
320 {
321 ASSERTE (vect.size==size);
322 vec<T> res(*this);
323 res-=vect;
324 return res;
325 }
326
327 vec<T> operator- () const
328 {
329 vec<T> res(*this);
330 for(int idx=0;idx<size;idx++)
331 res.m_data[idx]=-m_data[idx];
332 return res;
333 }
334
335 vec<T>& operator/=(const T val)
336 {
337 ASSERTE(val!=0);
338 for(int idx=0;idx<size;idx++)
339 m_data[idx]/=val;
340 return (*this);
341 }
342
343 vec<T> operator/ (const T val) const
344 {
345 vec<T> res(*this);
346 res/=val;
347 return res;
348 }
349
350 vec<T>& operator>>=(const int shr)
351 {
352 ASSERTE(shr>=0);
353 if (shr==0) return(*this);
354 for(int idx=0;idx<size;idx++)
355 m_data[idx]>>=shr;
356 return (*this);
357 }
358
359 vec<T> operator>> (const int shr) const
360 {
361 ASSERTE(shr>=0);
362 vec<T> res(*this);
363 res>>=shr;
364 return res;
365 }
366
367 vec<T>& operator<<=(const int shl)
368 {
369 ASSERTE(shl>=0);
370 if (shl==0) return(*this);
371 for(int idx=0;idx<size;idx++)
372 m_data[idx]<<=shl;
373 return (*this);
374 }
375
376 vec<T> operator<< (const int shl) const
377 {
378 ASSERTE(shl>=0);
379 vec<T> res(*this);
380 res<<=shl;
381 return res;
382 }
383
384 //-----------------------------------------
385 vec<T>& operator&=(const T& val)
386 {
387 for(int idx=0;idx<size;idx++)
388 m_data[idx]&=val;
389 return (*this);
390 }
391
392 vec<T>& operator&=(const vec<T>& vect)
393 {
394 for(int idx=0;idx<size;idx++)
395 m_data[idx]&=vect.m_data[idx];
396 return (*this);
397 }
398
399 vec<T> operator& (const T& val) const
400 {
401 vec<T> res(*this);
402 res&=val;
403 return res;
404 }
405
406 vec<T> operator& (const vec<T>& vect) const
407 {
408 vec<T> res(*this);
409 res&=vect;
410 return res;
411 }
412 //-----------------------------------------
413 vec<T>& operator|=(const T& val)
414 {
415 for(int idx=0;idx<size;idx++)
416 m_data[idx]|=val;
417 return (*this);
418 }
419
420 vec<T>& operator|=(const vec<T>& vect)
421 {
422 for(int idx=0;idx<size;idx++)
423 m_data[idx]|=vect.m_data[idx];
424 return (*this);
425 }
426
427 vec<T> operator| (const T& val) const
428 {
429 vec<T> res(*this);
430 res|=val;
431 return res;
432 }
433
434 vec<T> operator| (const vec<T>& vect) const
435 {
436 vec<T> res(*this);
437 res|=vect;
438 return res;
439 }
440 //-----------------------------------------
441 vec<T>& operator^=(const T& val)
442 {
443 for(int idx=0;idx<size;idx++)
444 m_data[idx]^=val;
445 return (*this);
446 }
447
448 vec<T>& operator^=(const vec<T>& vect)
449 {
450 for(int idx=0;idx<size;idx++)
451 m_data[idx]^=vect.m_data[idx];
452 return (*this);
453 }
454
455 vec<T> operator^ (const T& val) const
456 {
457 vec<T> res(*this);
458 res^=val;
459 return res;
460 }
461
462 vec<T> operator^ (const vec<T>& vect) const
463 {
464 vec<T> res(*this);
465 res^=vect;
466 return res;
467 }
468 int sum()
469 {
470 int summ=0;
471 for(int i=0;i<size;i++)
472 summ+=m_data[i];
473 return summ;
474 }
475
476 bool operator== (const vec<T> &vect)
477 {
478 ASSERTE (vect.size==size);
479 for(int idx=0;idx<size;idx++)
480 if (m_data[idx]!=vect.m_data[idx])
481 return false;
482 return true;
483 }
484
485 bool operator!= (const vec<T> &vect)
486 {
487 ASSERTE (vect.size==size);
488 for(int idx=0;idx<size;idx++)
489 if (m_data[idx]!=vect.m_data[idx])
490 return true;
491 return false;
492 }
493 //-----------------------------------------
494
495
496/*
497 template<class T2> void SetData(T2* Data)
498 {
499 for(int i=0;i<size;i++)
500 m_data[i]=Data[i];
501 }
502
503 template<class T2> void GetData(T2* Data)
504 {
505 for(int i=0;i<size;i++)
506 Data[i]=(T2)m_data[i].value;
507 }
508*/
509//void InitConst(T Value)
510//{
511// for (int idx=0;idx<size;idx++)
512// m_data[idx]=Value;
513//}
514};
515//template <class T> void InitInc(vec<T>& A,T StartValue=0,T Increment=1)
516//{
517// for (int idx=0;idx<A.size;idx++,StartValue+=Increment)
518// A[idx]=StartValue;
519//}
520
521 template<class T1, class T2> void Convert(vec<T1>& vSrc, vec<T2>& vDst){
522 ASSERTE(vSrc.size==vDst.size);
523 for(int i=0; i<vSrc.size; i++){
524 vDst[i]=(T2)vSrc[i];
525 }
526 }
527
528//bool operator== (const vec<T>& vec) const
529//bool operator!= (const vec<T>& vec) const;
530
531
532//*****************************************************************************
533//* Math function *
534//*****************************************************************************
536/*
537template <class T> T Norm2(vec<T>& X)
538{
539 T Buffer(0);
540 for(int idx=0;idx<X.size;idx++)
541 for(int col=0;col<X.width;col++)
542 Buffer+=X[idx]*X[idx];
543 return sqrt(Buffer);
544}
545
546template <class T> double vectorError(vec<T>& A,double *B)
547{
548 double Buffer=0;
549 double diff;
550 int idx=0;
551 for(int idx=0;idx<A.size;idx++,idx++)
552 for(int col=0;col<A.width;col++)
553 {
554 diff=double_(A[idx])-B[idx];
555 Buffer+=diff*diff;
556 }
557 return sqrt(Buffer)/(A.width*A.size);
558}
559*/
560template <class T> vec<T> Sqr(vec<T>& A)
561{
562 vec<T> Res(A);
563 for (int i=0;i<A.size;i++)
564 Res[i]=A[i]*A[i];
565 return Res;
566}
567template <class T> vec<T> Sqrt(vec<T>& A)
568{
569 vec<T> Res(A);
570 for (int i=0;i<A.size;i ++)
571 Res[i]=(T)sqrt((double)A[i]);
572 return Res;
573}
574
575template <class T> T Summ(vec<T>& A)
576{
577 T Sum(0);
578 for (int i=0;i<A.size;i ++)
579 Sum+=A[i];
580 return Sum;
581}
582
583template <class T> void Clear(vec<T>& A)
584{
585 for (int idx=0;idx<A.size;idx++)
586 A[idx]=0;
587}
588
589
590
591
592#endif
Definition: tmatrix.h:88
Definition: tvector.h:80