1 #include <../../nrnconf.h> 33 static char rcsid[] =
"vecop.c,v 1.1 1997/12/04 17:56:02 hines Exp";
47 limit =
min(a->dim,b->dim);
51 return __ip__(&(a->ve[i0]),&(b->ve[i0]),(
int)(limit-i0));
72 if ( out==(
VEC *)NULL || out->
dim != vector->
dim )
99 if ( vec1->dim != vec2->dim )
101 if ( out==(
VEC *)NULL || out->
dim != vec1->dim )
104 __add__(vec1->ve,vec2->ve,out->
ve,(
int)dim);
126 if ( v1->dim != v2->dim )
131 return v_add(v1,v2,out);
143 out =
v_add(v1,out,out);
157 VEC *vec1,*vec2,*out;
164 if ( vec1->dim != vec2->dim )
166 if ( out==(
VEC *)NULL || out->
dim != vec1->dim )
169 __sub__(vec1->ve,vec2->ve,out->
ve,(
int)(vec1->dim));
184 #ifdef PROTOTYPES_IN_STRUCT 196 if ( ! out || out->dim != x->dim )
199 dim = x->dim; x_ve = x->ve; out_ve = out->ve;
200 for ( i = 0; i < dim; i++ )
201 *out_ve++ = (*f)(*x_ve++);
207 #ifdef PROTOTYPES_IN_STRUCT 208 double (*f)(
void *,double);
220 if ( ! out || out->dim != x->dim )
223 dim = x->dim; x_ve = x->ve; out_ve = out->ve;
224 for ( i = 0; i < dim; i++ )
225 *out_ve++ = (*f)(params,*x_ve++);
243 for ( i = 1; i <
n; i++ )
247 out =
sv_mlt(a[0],v[0],out);
248 for ( i = 1; i <
n; i++ )
252 if ( v[i]->dim != out->
dim )
281 while ((par = va_arg(ap,
VEC *))) {
282 a_par = va_arg(ap,
double);
283 if (a_par == 0.0)
continue;
286 if ( out->
dim != par->
dim )
290 out =
v_add(out,par,out);
291 else if (a_par == -1.0)
292 out =
v_sub(out,par,out);
316 out = va_arg(ap,
VEC *);
317 par = va_arg(ap,
VEC *);
323 a_par = va_arg(ap,
double);
324 out =
sv_mlt(a_par,par,out);
326 while ((par = va_arg(ap,
VEC *))) {
327 a_par = va_arg(ap,
double);
328 if (a_par == 0.0)
continue;
331 if ( out->
dim != par->
dim )
335 out =
v_add(out,par,out);
336 else if (a_par == -1.0)
337 out =
v_sub(out,par,out);
361 if ( x1->dim != x2->dim )
365 for ( i = 0; i < x1->dim; i++ )
366 out->ve[i] = x1->ve[i] * x2->ve[i];
383 if ( x1->dim != x2->dim )
387 for ( i = 0; i < x1->dim; i++ )
392 out->ve[
i] = x2->ve[
i] / tmp;
413 for ( i = 1; i < x->dim; i++ )
423 if ( min_idx !=
NULL )
443 for ( i = 1; i < x->dim; i++ )
453 if ( max_idx !=
NULL )
472 int dim,
i,
j, l, r, tmp_i;
477 if ( order !=
PNULL && order->
size != x->dim )
482 if ( order !=
PNULL )
491 l = 0; r = dim-1; v = x_ve[0];
502 while ( x_ve[++i] < v )
504 while ( x_ve[--j] > v )
511 if ( order !=
PNULL )
513 tmp_i = order->
pe[
i];
514 order->
pe[
i] = order->
pe[
j];
515 order->
pe[
j] = tmp_i;
521 if ( order !=
PNULL )
523 tmp_i = order->
pe[
i];
524 order->
pe[
i] = order->
pe[r];
525 order->
pe[r] = tmp_i;
529 { stack[sp++] = l; stack[sp++] = i-1; l = i+1; }
531 { stack[sp++] = i+1; stack[sp++] = r; r = i-1; }
555 for ( i = 0; i < x->dim; i++ )
569 if ( x1 == out || x2 == out )
571 if ( x1->dim == 0 || x2->dim == 0 )
574 out =
v_resize(out,x1->dim + x2->dim - 1);
576 for ( i = 0; i < x1->dim; i++ )
577 __mltadd__(&(out->ve[i]),x2->ve,x1->ve[i],x2->dim);
591 if ( x1 == out || x2 == out )
598 for ( i = 0; i < x1->dim; i++ )
600 __mltadd__(&(out->ve[i]),x2->ve,x1->ve[i],x2->dim - i);
602 __mltadd__(out->ve,&(x2->ve[x2->dim - i]),x1->ve[i],i);
VEC * v_slash(VEC *x1, VEC *x2, VEC *out)
VEC * _v_map(double(*f)(), void *params, VEC *x, VEC *out)
double _in_prod(VEC *a, VEC *b, u_int i0)
VEC * v_add(VEC *vec1, VEC *vec2, VEC *out)
static Object ** v_resize(void *v)
VEC * v_map(double(*f)(), VEC *x, VEC *out)
VEC * v_star(VEC *x1, VEC *x2, VEC *out)
VEC * v_lincomb(int n, v, a, *out)
VEC * v_mltadd(VEC *v1, VEC *v2, double scale, VEC *out)
VEC * v_sort(VEC *x, PERM *order)
int const size_t const size_t n
void __mltadd__(Real *dp1, Real *dp2, double s, int len)
PERM * px_resize(PERM *, int)
#define tracecatch(ok_part, function)
void __add__(Real *dp1, Real *dp2, Real *out, int len)
double __ip__(Real *dp1, Real *dp2, int len)
double v_min(VEC *x, int *min_idx)
VEC * v_conv(VEC *x1, VEC *x2, VEC *out)
VEC * sv_mlt(double scalar, VEC *vector, VEC *out)
#define error(err_num, fn_name)
void __sub__(Real *dp1, Real *dp2, Real *out, int len)
VEC * v_linlist(VEC *out, VEC *v1, double a1,...)
double v_max(VEC *x, int *max_idx)
VEC * v_sub(VEC *vec1, VEC *vec2, VEC *out)
VEC * v_pconv(VEC *x1, VEC *x2, VEC *out)
void __smlt__(Real *dp, double s, Real *out, int len)
PERM * px_ident(PERM *px)