/* Performs a linear regression of the Function; returns the pair [ a, b] where f(x) = a*x + b if the optional arguments _first_ and _last_ are provided, they represent the indices of the first and last elements. */ static VALUE function_reglin(int argc, VALUE *argv, VALUE self) { long len = function_sanity_check(self); const double *x = Dvector_Data_for_Read(get_x_vector(self),NULL); const double *y = Dvector_Data_for_Read(get_y_vector(self),NULL); VALUE ret = rb_funcall(cDvector, idNew, 1, INT2NUM(2)); double * dat = Dvector_Data_for_Write(ret, NULL); long nb; if(argc == 2) { long f = NUM2LONG(argv[0]); long l = NUM2LONG(argv[1]); if(f < 0) f = len + f; if(l < 0) l = len + l; x += f; y += f; nb = l - f; } else if(argc == 0) { nb = len; } else { rb_raise(rb_eArgError, "reglin should have 0 or 2 parameters"); } reglin(x,y,nb,dat,dat+1); return ret; }