Esempio n. 1
0
File: opt.c Progetto: Unode/ext_apps
double dfridr(double (*func)(double), double x, double h, double *err)
{
  int i,j;
  double errt,fac,hh,ans;
  static double **a=0;
  
  if(h==0.0) error("h must be nonzero in dfridr");
  if(!a) a=new_mat(NTAB,NTAB);
  hh=h;
  a[0][0]=((*func)(x+hh)-(*func)(x-hh))/(2.0*hh);
  *err=BIG;
  for(i=1;i<NTAB;i++) {
    hh /= CON;
    a[0][i]=((*func)(x+hh)-(*func)(x-hh))/(2.0*hh);
    fac=CON2;
    for(j=1;j<=i;j++) {
      a[j][i]=(a[j-1][i]*fac-a[j-1][i-1])/(fac-1.0);
      fac=CON2*fac;
      errt=DMAX(fabs(a[j][i]-a[j-1][i]),fabs(a[j][i]-a[j-1][i-1]));
      if(errt<=*err) {
	*err=errt; ans=a[j][i];
      }
    }
    if(fabs(a[i][i]-a[i-1][i-1]) >= SAFE*(*err)) break;
  }
  return ans;
}
Esempio n. 2
0
void confirm_material(const char *name) {
	MAT_TYPE *mat, *mat_next;
	
	if(IS_NULLSTR(name))
		return;
	
	// materials that are '0' are NULL
	if(is_number(name))
		return;
	
	for(mat = mat_list; mat; mat = mat_next) {
		mat_next = mat->next;

		if(IS_NULLSTR(mat->name))
			continue;

		if(!str_cmp(mat->name, name))
			return;
	}
	
	matValue++;
	mat = new_mat();

	mat->name = str_dup(name);
	mat->assignedValue = matValue;

	mat->next = mat_list;
	mat_list = mat;

	return;
}
Esempio n. 3
0
void load_materials(void) {
	bool fMatch;

	closeReserve();
	FILE *fp = fopen(MATERIAL_FILE, "r");
	if(!fp) return; // no materials to load.

	while(true)
	{
		const char *word  = feof( fp ) ? "End" : fread_word( fp );
		fMatch = FALSE;

		if(!str_cmp(word, "End")) {
			break;
		}

		if(!str_cmp(word, "MAT")) {
			MAT_TYPE *mat = new_mat();

			while(true) {
				word = feof( fp ) ? "End" : fread_word(fp);
				if(!str_cmp(word, "End")) {
					bug(Format("Prematurely reached end of materials data file; data corrupted!"), 0);
					fclose(fp);
					openReserve();
					return;
				}
				bool finished = false;
				switch ( UPPER(word[0]) )
				{
				case '*':
					fMatch = TRUE;
					fread_to_eol( fp );
					break;
				case 'E':
					if(!str_cmp(word, "ENDMAT")) {

						mat->next = mat_list;
						mat_list = mat;

						matValue++;
						finished = true;
						break;
					}
				case 'V':
					KEY("VAL",	mat->assignedValue, fread_number(fp) );
					break;
				case 'N':
					KEYS( "NAME",		mat->name,		fread_string(fp) );
					break;
				}
				if(finished)
					break;
			}
		}
	}
	fclose(fp);
	openReserve();
}
Esempio n. 4
0
File: opt.c Progetto: Unode/ext_apps
void dfnmin(double p[], int n, double gtol, int itmax, int maxback,
	    int *iter, double *fret,
	    double ***hesinv,
	    double(*func)(double []), void (*dfunc)(double [], double []),
	    void (*ddfunc)(double [], double **))
{
  double *g, **A, **Ainv, *xi, *pnew;
  double sum,fp,fnew,lam,x;
  int loop,i,j,k;

  g=new_vec(n); xi=new_vec(n); pnew=new_vec(n);  
  A=new_mat(n,n); Ainv=new_mat(n,n);
  fp=(*func)(p); /* function */      
  for(loop=1;loop<=itmax;loop++) {
    (*dfunc)(p,g); /* derivative */
    (*ddfunc)(p,A); /* second derivative */
    luinverse(A,Ainv,n);
    x=sym_mat(Ainv,n);

    sum=0.0;
    for(i=0;i<n;i++) {
      x=0.0; for(j=0;j<n;j++) x+=Ainv[i][j]*g[j];
      sum+=g[i]*x; xi[i] = -x;
    }
    if(sum>=0.0) lam=1.0; else lam=-1.0;
    for(k=0;k<maxback;k++) {
      for(i=0;i<n;i++) pnew[i]=p[i]+lam*xi[i];
      fnew=(*func)(pnew); /* function */      
      mydprintf(3,"\n### dfnmin: lam=%g fnew=%g fp=%g",lam,fnew,fp);
      if(fnew < fp) break;
      lam *= 0.1;
    }
    if(k==maxback) break;
    fp=fnew;
    for(i=0;i<n;i++) p[i]=pnew[i];
    mydprintf(3,"\n### dfnmin: loop=%d sum=%g fp=%g",loop,sum,fp);
    if(sum>=0 && sum<gtol) break;
  }

  *fret=fp; /* function */
  *iter=loop;
  *hesinv=Ainv;

  free_mat(A); free_vec(g); free_vec(xi); free_vec(pnew);
}
Esempio n. 5
0
matrix matrix::operator-(const matrix& m)
{
	if(row != m.row || col != m.col)
	{
		cerr << "Matrix sizes do not match." << endl;
		return (*this);
	}
	matrix new_mat(*this);
	return (new_mat -= m);
}
Esempio n. 6
0
cv::Mat EMat::prepad(int x_padsize, int y_padsize, pad_dir dir, const cv::Scalar &padval) {
    cv::Mat new_mat;
    assert(x_padsize || y_padsize);

    // Create a new matrix of the appropriate size and initialize it
    if ((dir == pre) || (dir == post))
        new_mat.create(rows + y_padsize, cols + x_padsize, type());
    else
        new_mat.create(rows + (y_padsize * 2), cols + (x_padsize * 2), type());
    new_mat = padval;

    // Place the old matrix in the appropriate location
    cv::Mat target;
    if (dir == post)
        target = new_mat(cv::Rect(0, 0, cols, rows));
    else // Both pre and both have the same target rect
        target = new_mat(cv::Rect(x_padsize, y_padsize, cols, rows));

    copyTo(target);

    return new_mat;
}
Esempio n. 7
0
t_matrix	transpose_mat(t_matrix *m)
{
	t_matrix	mat;
	int			i;
	int			j;

	i = 0;
	mat = new_mat(m->cols, m->rows, 0);
	if (mat.mat == NULL)
		perror("Matrix: Error matrix creation\n");
	while (i < m->cols)
	{
		j = 0;
		while (j < m->rows)
		{
			mat.mat[i][j] = m->mat[j][i];
			j++;
		}
		i++;
	}
	return (mat);
}
Esempio n. 8
0
matrix matrix::operator*(const double v)
{
	matrix new_mat(*this);
	return (new_mat*=v);
}