static VALUE rb_gsl_blas_drotm2(VALUE obj, VALUE xx, VALUE yy, VALUE PP) { gsl_vector *x = NULL, *y = NULL, *p = NULL, *xnew = NULL, *ynew = NULL; int flag = 0, i; CHECK_VECTOR(xx); CHECK_VECTOR(yy); Data_Get_Struct(xx, gsl_vector, x); Data_Get_Struct(yy, gsl_vector, y); if (rb_obj_is_kind_of(PP, cgsl_vector)) { Data_Get_Struct(PP, gsl_vector, p); } else { if (TYPE(PP) != T_ARRAY) rb_raise(rb_eTypeError, "wrong argument type %s (Array of Vector expected", rb_class2name(CLASS_OF(PP))); // p = gsl_vector_alloc(RARRAY(PP)->len); p = gsl_vector_alloc(RARRAY_LEN(PP)); for (i = 0; i < RARRAY_LEN(PP); i++) { gsl_vector_set(p, i, rb_ary_entry(PP, i)); } flag = 1; } xnew = gsl_vector_alloc(x->size); ynew = gsl_vector_alloc(y->size); gsl_vector_memcpy(xnew, x); gsl_vector_memcpy(ynew, y); gsl_blas_drotm(xnew, ynew, p->data); if (flag == 1) gsl_vector_free(p); return rb_ary_new3(2, Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, xnew), Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, ynew)); }
/** * C++ version of gsl_blas_drotm(). * @param X A vector * @param Y A vector * @param P An array * @return Error code on failure */ int drotm( vector& X, vector& Y, double const P[] ){ return gsl_blas_drotm( X.get(), Y.get(), P ); }