18 #include "MathVector.h" 19 #include "MathMatrix.h" 20 #include "MathConstant.h" 25 #define _USE_MATH_DEFINES 31 int Vector::alloc = 32;
43 if (data != NULL)
delete [] data;
46 void Vector::Dimension(
int d)
52 size = (d + alloc) / alloc * alloc;
53 double * newData =
new double [size];
56 for (
int i = 0; i < dim; i++)
67 double * newData =
new double [size];
70 for (
int i = 0; i < dim; i++)
80 void Vector::Dimension(
int d,
double value)
86 for (
int i = original; i < dim; i++)
92 for (
int i = 0; i < dim; i++)
96 void Vector::Add(
double n)
98 for (
int i = 0; i< dim; i++)
102 void Vector::Multiply(
double k)
104 for (
int i = 0; i < dim; i++)
108 void Vector::Copy(
const Vector & v)
113 for (
int i=0; i < dim; i++)
123 void Vector::Add(
Vector & v)
126 error(
"Vector::Add - vectors have different dimensions\n" 127 "Vectors - %s [%d] + %s [%d] ",
128 (
const char *) label, dim, (
const char *) v.label, v.dim);
130 for (
int i = 0; i < dim; i++)
131 data[i] += v.data[i];
134 void Vector::AddMultiple(
double k,
Vector & v)
137 error(
"Vector::AddMultiple - vectors are incompatible\n" 138 "Vectors - %s [%d] + %s [%d] ",
139 (
const char *) label, dim, (
const char *) v.label, v.dim);
141 for (
int i = 0; i < dim; i++)
142 data[i] += k * v.data[i];
146 void Vector::Subtract(
Vector & v)
149 error(
"Vector::Subtract - vectors have different dimensions\n" 150 "Vectors - %s [%d] + %s [%d] ",
151 (
const char *) label, dim, (
const char *) v.label, v.dim);
153 for (
int i = 0; i < dim; i++)
154 data[i] -= v.data[i];
160 for (
int i = 0; i < dim; i++)
164 void Vector::Set(
double k)
166 for (
int i = 0; i < dim; i++)
170 void Vector::SetMultiple(
double k,
Vector & v)
174 for (
int i = 0; i < dim; i++)
178 double Vector::InnerProduct(
Vector & v)
181 error(
"Vector::InnerProduct - vectors have different dimensions\n" 182 "Vectors - %s[%d] * %s[%d] ",
183 (
const char *) label, dim, (
const char *) v.label, v.dim);
186 for (
int i = 0; i < dim; i++)
187 sum += data[i] * v.data[i];
192 void Vector::Insert(
int n,
double value)
196 for (
int i = dim - 1; i > n; i--)
197 data[i] = data[i - 1];
201 void Vector::DeleteDimension(
int n)
203 for (
int i = n; i < dim - 1; i++)
204 data[i] = data[i + 1];
211 error(
"Vector::Product - Cannot Multiply Matrix by Vector\n" 212 "Vectors - %s [%d, %d] * %s [%d]\n",
213 (
const char *) m.label, m.rows, m.cols,
214 (
const char *) v.label, v.dim);
219 for (
int i = 0; i < m.rows; i++)
220 for (
int j = 0; j < m.cols; j++)
221 data[i] += m[i][j] * v[j];
224 double Vector::Average()
const 227 error(
"Average undefined for null vector %s",
228 (
const char *) label);
233 double Vector::Product()
const 235 double product = 1.0;
237 for (
int j = 0; j < dim; j++)
243 double Vector::Sum()
const 247 for (
int j=0; j<dim; j++)
253 double Vector::SumSquares()
const 257 for (
int j=0; j<dim; j++)
258 sum += data[j] * data[j];
263 void Vector::AveVar(
double & ave,
double & var)
const 269 error(
"Average and Variance undefined for null vector %s",
270 (
const char *) label);
274 ave = var = ep = 0.0;
276 for (
int j=0; j<dim; j++)
281 for (
int j=0; j<dim; j++)
289 var = (var - ep*ep/dim)/(dim-1);
292 double Vector::Var()
const 299 double Vector::StandardDeviation()
const 303 if (var < 0.0) var = 0.0;
308 void Vector::Print(FILE * f,
int d)
310 if (d == -1 || d > dim) d = dim;
312 fprintf(f,
"%.15s : ", (
const char *) label);
313 for (
int i = 0; i < d; i++)
314 fprintf(f,
"%7.3f ", data[i]);
318 int Vector::CompareDouble(
const double * a,
const double * b)
320 if (*a < *b)
return -1;
321 if (*a > *b)
return 1;
327 QuickSort(data, dim,
sizeof(
double), COMPAREFUNC CompareDouble);
330 void Vector::Sort(
Vector & freeRider)
332 QuickSort2(data, freeRider.data, dim,
sizeof(
double),
333 COMPAREFUNC CompareDouble);
336 int Vector::BinarySearch(
double element)
338 void * pointer = ::BinarySearch
339 (&element, data, dim,
sizeof(
double), COMPAREFUNC CompareDouble);
344 return ((
double *) pointer) - data;
347 void Vector::RemoveDuplicates()
351 for (
int in = 1; in < Length(); in++)
352 if (data[in] != data[out])
353 data[++out] = data[in];
358 bool Vector::operator == (
const Vector & rhs)
const 360 if (rhs.dim != dim)
return false;
362 for (
int i = 0; i < dim; i++)
363 if (data[i] != rhs[i])
371 int Vector::CountIfGreater(
double threshold)
const 375 for (
int i = 0; i < dim; i++)
376 if (data[i] > threshold)
382 int Vector::CountIfGreaterOrEqual(
double treshold)
const 386 for (
int i = 0; i < dim; i++)
387 if (data[i] >= treshold)
396 double Vector::Min()
const 401 double min = data[0];
403 for (
int i = 1; i < dim; i++)
410 double Vector::Max()
const 415 double max = data[0];
417 for (
int i = 1; i < dim; i++)
427 void Vector::Push(
double value)
430 data[dim - 1] = value;
433 void Vector::Stack(
const Vector & v)
437 Dimension(dim + v.dim);
439 for (
int i = 0; i < v.dim; i++)
440 data[i + end] = v[i];
446 bool Vector::isAscending()
448 for (
int i = 1; i < dim; i++)
449 if (data[i] < data[i - 1])
454 bool Vector::isDescending()
456 for (
int i = 1; i < dim; i++)
457 if (data[i] > data[i - 1])
465 VectorFunc::VectorFunc()
470 VectorFunc::VectorFunc(
double(*func)(
Vector &))
475 double VectorFunc::Evaluate(
Vector & v)
481 #define M_SQRT2 1.41421356 485 #define SQRT_HALF (1.0/M_SQRT2) 486 #define TWO (M_SQRT2 * M_SQRT2) 488 void VectorFunc::Derivative(
Vector & x,
Vector & d,
double h_start)
490 double a[MAXROUNDS][MAXROUNDS];
493 for (
int k = 0; k < x.dim; k++)
496 double save_x = x[k];
504 if (k == 0 || left < dfmin)
505 dfmin = left, dpmin = x;
513 dfmin = left, dpmin = x;
516 a[0][0] = (right - left) / (2.0 * h);
523 for (
int i = 1; i < MAXROUNDS; i++)
531 if (left < dfmin) dfmin = left, dpmin = x;
534 if (right < dfmin) dfmin = right, dpmin = x;
537 a[0][i] = (right - left) / (2.0 * h);
542 for (
int j = 1; j <= i; j++)
544 a[j][i] = (a[j-1][i] * factor - a[j-1][i-1])/(factor - 1.0);
548 double error = max(fabs(a[j][i] - a[j-1][i]), fabs(a[j][i] - a[j-1][i-1]));
559 if (fabs(a[i][i] - a[i-1][i-1]) >= 2.0 * err)
570 int Vector::SafeCount()
const 572 int nonMissing = dim;
574 for (
int i = 0; i < dim; i++)
575 if (data[i] == _NAN_)
581 double Vector::SafeMin()
const 586 for (i = 0; i < dim; i++)
587 if (data[i] != _NAN_)
594 if (data[i] != _NAN_ && data[i] < min)
600 double Vector::SafeMax()
const 605 for (i = 0; i < dim; i++)
606 if (data[i] != _NAN_)
613 if (data[i] != _NAN_ && data[i] > max)
619 void Vector::Reverse()
621 for (
int i = 0, j = dim - 1; i < j; i++, j--)
625 void Vector::InsertInSortedList(
int value)
630 while (pos >= 0 && data[pos] > value)
634 if (pos >= 0 && data[pos] == value)
642 for (
int i = dim - 1; i > pos; i--)
643 data[i] = data[i - 1];
648 void Vector::Swap(
Vector & rhs)
650 double * temp = rhs.data;
663 double Vector::Average(
double returnIfNull)
671 double Vector::Var(
double returnIfNull)
679 double Vector::StandardDeviation(
double returnIfNull)
684 return StandardDeviation();