Beispiel #1
0
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;
}
Beispiel #2
0
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);
}