Mass++ Common Libraries v2.7.5
 All Classes Namespaces Files Functions Variables Enumerations Macros
Vector.cpp
Go to the documentation of this file.
1 
12 #include "stdafx.h"
13 #include "Vector.h"
14 
15 #include <math.h>
16 
17 
18 using namespace kome::core;
19 
20 
21 #include <crtdbg.h>
22 #ifdef _DEBUG
23  #define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
24  #define malloc( s ) _malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ )
25 #endif // _DEBUG
26 
27 
28 
29 // constructor
30 Vector::Vector( const unsigned int dim )
31  : m_dim( dim ), m_array( ( dim == 0 ) ? NULL : new double[ dim ] ) {
32  if( m_array != NULL ) {
33  fillzero( m_array, sizeof( double ) * m_dim );
34  }
35 }
36 
37 // copy constructor
38 Vector::Vector( const Vector& v )
39  : m_dim( v.m_dim ), m_array( ( v.m_array == NULL ) ? NULL : new double[ v.m_dim ] ) {
40  if( m_array != NULL ) {
41  memcpy( m_array, v.m_array, sizeof( double ) * v.m_dim );
42  }
43 }
44 
45 // destructor
47  if( m_array != NULL ) {
48  delete[] m_array;
49  }
50 }
51 
52 // get the dimention size
53 unsigned int Vector::getDimention() {
54  return m_dim;
55 }
56 
57 // get norm
58 double Vector::norm() {
59  double n = 0.0;
60  for( unsigned int i = 0; i < m_dim; i++ ) {
61  n += ( m_array[ i ] * m_array[ i ] );
62  }
63 
64  n = sqrt( n );
65 
66  return n;
67 }
68 
69 // dot production
70 double Vector::dot( const Vector& v ) {
71  if( v.m_dim != m_dim ) {
72  throw FMT( "Vector size is illegal." );
73  }
74 
75  double dp = 0.0;
76  for( unsigned int i = 0; i < m_dim; i++ ) {
77  dp += m_array[ i ] * v.m_array[ i ];
78  }
79 
80  return dp;
81 }
82 
83 // cross production
85  if( m_dim != 3 || v.m_dim != 3 ) {
86  throw FMT( "Vector size is illegal." );
87  }
88 
89  Vector tmp( 3 );
90  tmp( 0 ) = m_array[ 1 ] * v.m_array[ 2 ] - m_array[ 2 ] * v.m_array[ 1 ];
91  tmp( 1 ) = m_array[ 2 ] * v.m_array[ 0 ] - m_array[ 0 ] * v.m_array[ 2 ];
92  tmp( 2 ) = m_array[ 0 ] * v.m_array[ 1 ] - m_array[ 1 ] * v.m_array[ 0 ];
93 
94  return tmp;
95 }
96 
97 // copy
99  if( v.m_dim != m_dim ) {
100  throw FMT( "Vector size is illegal." );
101  }
102 
103  if( m_array != NULL ) {
104  memcpy( m_array, v.m_array, sizeof( double ) * m_dim );
105  }
106 
107  return *this;
108 }
109 
110 // get reference of value
111 double& Vector::operator()( const unsigned int index ) {
112  // check parameter
113  if( index >= m_dim ) {
114  throw FMT( "The specified element does not exist. [dimension=%d, index=%d]", m_dim, index );
115  }
116 
117  return m_array[ index ];
118 }
119 
120 // vector addition
122  // check size
123  if( v.m_dim != m_dim ) {
124  throw FMT( "Vector size is illegal." );
125  }
126 
127  // addition
128  for( unsigned int i = 0; i < m_dim; i++ ) {
129  m_array[ i ] += v.m_array[ i ];
130  }
131 
132  return *this;
133 }
134 
135 // vector subtraction
137  // check size
138  if( v.m_dim != m_dim ) {
139  throw FMT( "Vector size is illegal." );
140  }
141 
142  // addition
143  for( unsigned int i = 0; i < m_dim; i++ ) {
144  m_array[ i ] -= v.m_array[ i ];
145  }
146 
147  return *this;
148 }
149 
150 // scalar multiplication
151 Vector& Vector::operator*=( const double k ) {
152  // multiplication
153  for( unsigned int i = 0; i < m_dim; i++ ) {
154  m_array[ i ] *= k;
155  }
156 
157  return *this;
158 }
159 
160 // scalar division
161 Vector& Vector::operator/=( const double k ) {
162  // division
163  for( unsigned int i = 0; i < m_dim; i++ ) {
164  m_array[ i ] /= k;
165  }
166 
167  return *this;
168 }
169 
170 // vector addition
172  Vector tmp = *this;
173  tmp += v;
174 
175  return tmp;
176 }
177 
178 // vector subtraction
180  Vector tmp = *this;
181  tmp -= v;
182 
183  return tmp;
184 }
185 
186 // scalar multiplication
187 Vector Vector::operator*( const double k ) {
188  Vector tmp = *this;
189  tmp *= k;
190 
191  return tmp;
192 }
193 
194 // scalar division
195 Vector Vector::operator/( const double k ) {
196  Vector tmp = *this;
197  tmp /= k;
198 
199  return tmp;
200 }
virtual ~Vector()
destructor
Definition: Vector.cpp:46
Vector cross(const Vector &v)
get cross production
Definition: Vector.cpp:84
Vector operator=(const Vector &v)
copy vector
Definition: Vector.cpp:98
vector class
Definition: Vector.h:22
double norm()
gets the norm of the vector
Definition: Vector.cpp:58
Vector operator/(const double k)
scalar division
Definition: Vector.cpp:195
const unsigned int m_dim
Definition: Vector.h:46
unsigned int getDimention()
gets the dimention size of vector
Definition: Vector.cpp:53
Vector operator-(const Vector &v)
vector subtraction
Definition: Vector.cpp:179
double *const m_array
Definition: Vector.h:48
#define NULL
Definition: CoreMacros.h:18
Vector & operator+=(const Vector &v)
vector addition
Definition: Vector.cpp:121
Vector & operator-=(const Vector &v)
vector subtraction
Definition: Vector.cpp:136
interfaces of Vector class
Vector operator*(const double k)
scalar multiplication
Definition: Vector.cpp:187
double & operator()(const unsigned int index)
gets reference of value of specified element
Definition: Vector.cpp:111
Vector operator+(const Vector &v)
vector addition
Definition: Vector.cpp:171
Vector & operator/=(const double k)
scalar division
Definition: Vector.cpp:161
Vector(const unsigned int dim)
constructor
Definition: Vector.cpp:30
double dot(const Vector &v)
gets dot production
Definition: Vector.cpp:70
void fillzero(void *p, size_t n)
This function fills a block of memory zeros.
Vector & operator*=(const double k)
scalar multiplication
Definition: Vector.cpp:151