char *submacro(char *str, pmx_t capt) { char *name; char *bd; char c; if (pmxLen(capt,1) == 0) return ""; name = str+pmxStart(capt,1); c = name[pmxLen(capt,1)]; name[pmxLen(capt,1)] = '\0'; while (*name) { *name = tolower((int)*name); name++; } name = str+pmxStart(capt,1); bd = tblGetSS(macros,name,NULL); if (!bd) { fprintf(stderr,"Unknown macro: '%s'\n",name); return ""; } while (*bd && *bd++ != '$'); chsCpy(rpl,bd); name[pmxLen(capt,1)] = c; vecFree(args); if (pmxLen(capt,2)>2) { name = str+pmxStart(capt,2); c = name[pmxLen(capt,2)]; name[pmxLen(capt,2)] = '\0'; args = vecSplit(name,","," \t()"); name[pmxLen(capt,2)] = c; } /* replace args */ chsSubFun(rpl,0,">$<=$1-9>",subargs); return rpl; }
static int QRM( Mat a, Vec dv ) { Vec ev, ev1; double w, t, s, x, y, c; double *v1, *v2; int dim, iter; int i, j, k, h; dim = a.row; if( dim != a.clm || dim < 2 ) return(-1); if( dv.clm != dim ) return(-1); ev = vecAlloc( dim ); if( ev.clm != dim ) return(-1); ev1.clm = dim-1; ev1.v = &(ev.v[1]); if( vecTridiagonalize( a, dv, ev1 ) < 0 ) { vecFree( ev ); return(-1); } ev.v[0] = 0.0; for( h = dim-1; h > 0; h-- ) { j = h; while(fabs(ev.v[j]) > EPS*(fabs(dv.v[j-1])+fabs(dv.v[j]))) j--; if( j == h ) continue; iter = 0; do{ iter++; if( iter > MAX_ITER ) break; w = (dv.v[h-1] - dv.v[h]) / 2; t = ev.v[h] * ev.v[h]; s = sqrt(w*w+t); if( w < 0 ) s = -s; x = dv.v[j] - dv.v[h] + t/(w+s); y = ev.v[j+1]; for( k = j; k < h; k++ ) { if( fabs(x) >= fabs(y) ) { if( fabs(x) > VZERO ) { t = -y / x; c = 1 / sqrt(t*t+1); s = t * c; } else{ c = 1.0; s = 0.0; } } else{ t = -x / y; s = 1.0 / sqrt(t*t+1); c = t * s; } w = dv.v[k] - dv.v[k+1]; t = (w * s + 2 * c * ev.v[k+1]) * s; dv.v[k] -= t; dv.v[k+1] += t; if( k > j) ev.v[k] = c * ev.v[k] - s * y; ev.v[k+1] += s * (c * w - 2 * s * ev.v[k+1]); for( i = 0; i < dim; i++ ) { x = a.m[k*dim+i]; y = a.m[(k+1)*dim+i]; a.m[k*dim+i] = c * x - s * y; a.m[(k+1)*dim+i] = s * x + c * y; } if( k < h-1 ) { x = ev.v[k+1]; y = -s * ev.v[k+2]; ev.v[k+2] *= c; } } } while(fabs(ev.v[h]) > EPS*(fabs(dv.v[h-1])+fabs(dv.v[h]))); } for( k = 0; k < dim-1; k++ ) { h = k; t = dv.v[h]; for( i = k+1; i < dim; i++ ) { if( dv.v[i] > t ) { h = i; t = dv.v[h]; } } dv.v[h] = dv.v[k]; dv.v[k] = t; v1 = &(a.m[h*dim]); v2 = &(a.m[k*dim]); for( i = 0; i < dim; i++ ) { w = *v1; *v1 = *v2; *v2 = w; v1++; v2++; } } vecFree( ev ); return(0); }