40 #include "EST_DMatrix.h"
50 for(
int i=0; i<x.
n(); ++i)
53 return polynomial_fit(x,y,co_effs,weights,order);
61 cerr <<
"polynomial_fit : order must be >= 1" << endl;
66 cerr <<
"polynomial_fit : x and y must have same dimension" << endl;
70 if(weights.
n() != y.
n()){
71 cerr <<
"polynomial_fit : weights must have same dimension as x and y" << endl;
76 cerr <<
"polynomial_fit : x and y must have at least order+1 elements"
89 for(
int row=0;row<y.
n();row++)
91 y1[row] = y[row] * weights[row];
92 for(
int col=0;col<=order;col++){
93 A(row,col) = pow(x[row],(
double)col) * weights[row];
108 if(!inverse(At_A,At_A_inv,singularity))
110 cerr <<
"polynomial_fit : inverse failed (";
111 if(singularity == -2)
112 cerr <<
"unspecified reason)" << endl;
113 else if(singularity == -1)
114 cerr <<
"non-square !!)" << endl;
117 cerr <<
"singularity at point : " << singularity;
118 cerr <<
" = " << x[singularity] <<
"," << y[singularity];
119 cerr <<
" )" << endl;
125 co_effs = At_A_inv * At_y1;
166 cerr <<
"diagonalise: non-square matrix ";
194 for (i = I = 0; i < n; ++i, ++I)
198 for (j = J = 0; j < n; ++j, ++J)
217 s(0, i) = a.a(row, i);
228 s(i, 0) = a.a(i, col);
261 for (i = 0; i < n; ++i)
262 for (j = 0; j < n; ++j)
263 t(n - i - 1, n - j - 1) = a.a(i, j);
283 static void row_swap(
int from,
int to,
EST_DMatrix &a)
302 return inverse(a,inv,singularity);
321 int r=0,this_row,all_zeros;
397 singularity = ((this_row > j) ? this_row : j);
409 return pseudo_inverse(a,inv,singularity);
420 return inverse(a,inv,singularity);
427 transpose(a,a_trans);
428 multiply(a_trans,a,atrans_a);
429 if (!inverse(atrans_a,atrans_a_inverse,singularity))
431 multiply(atrans_a_inverse,a_trans,inv);
444 cerr <<
"Tried to take determinant of non-square matrix\n";
458 for (i = 0; i < n; ++i)
460 p = (double)(i + j + 2);
462 A[i] = pow(-1.0, p) * determinant(sub(a, i, j));
468 for (i = 0; i < n; ++i)
493 cerr <<
"Can't make non-square identity matrix !" << endl;
510 cerr <<
"Can't subtract vectors of differing lengths !" << endl;
531 cerr <<
"Can't subtract vectors of differing lengths !" << endl;
550 cerr <<
"Can't extract diagonal of non-square matrix !" << endl;
561 double polynomial_value(
const EST_DVector &coeffs,
const double x)
565 for(
int i=0;i<coeffs.
length();i++)
581 cerr <<
"Can't symmetrize non-square matrix !" << endl;
606 make_random_matrix(
EST_DMatrix &M,
const double scale)
610 for(
int row=0;row<M.
num_rows();row++)
613 r = scale * ((double)rand()/(double)RAND_MAX);
619 make_random_vector(
EST_DVector &V,
const double scale)
623 for(
int i=0;i<V.
length();i++)
625 r = scale * ((double)rand()/(double)RAND_MAX);
631 make_random_symmetric_matrix(
EST_DMatrix &M,
const double scale)
635 cerr <<
"Can't make non-square symmetric matrix !" << endl;
641 for(
int row=0;row<M.
num_rows();row++)
642 for(
int col=0;col<=row;col++)
644 r = scale * ((double)rand()/(double)RAND_MAX);
651 make_random_diagonal_matrix(
EST_DMatrix &M,
const double scale)
655 cerr <<
"Can't make non-square symmetric matrix !" << endl;
660 for(
int row=0;row<M.
num_rows();row++)
661 M.
a_no_check(row,row) = scale * ((double)rand()/(double)RAND_MAX);
671 cerr <<
"Can't make polynomial basis function : dimension mismatch !" << endl;
672 cerr <<
"t.length()=" << t.
length();
673 cerr <<
" T.num_rows()=" << T.
num_rows() << endl;
676 for(
int row=0;row<T.
num_rows();row++)
678 T.
a_no_check(row,col) = pow(t[row],(
double)col);
705 for(
int i=0;i<v1.
length();i++)
706 for(
int j=0;j<v2.
length();j++)