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; }
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; }
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(); }
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); }
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); }
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; }
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); }
matrix matrix::operator*(const double v) { matrix new_mat(*this); return (new_mat*=v); }