double* get_vector_ptr(VALUE ary, size_t *stride, size_t *n) { gsl_vector *v = NULL; gsl_vector_complex *vc = NULL; gsl_matrix *m; if (VECTOR_P(ary)) { Data_Get_Struct(ary, gsl_vector, v); *stride = v->stride; *n = v->size; return v->data; } else if (VECTOR_COMPLEX_P(ary)) { Data_Get_Struct(ary, gsl_vector_complex, vc); *stride = vc->stride; *n = vc->size*2; return vc->data; } else if (MATRIX_P(ary)) { Data_Get_Struct(ary, gsl_matrix, m); *stride = 1; *n = m->size1*m->size2; return m->data; #ifdef HAVE_NARRAY_H } else if (NA_IsNArray(ary)) { VALUE ary2; *n = NA_TOTAL(ary); *stride = 1; ary2 = na_change_type(ary, NA_DFLOAT); return NA_PTR_TYPE(ary2,double*); #endif #ifdef HAVE_NMATRIX_H } else if (NM_IsNMatrix(ary)) {
VALUE rb_gsl_math_complex_eval(gsl_complex (*func)(gsl_complex), VALUE obj) { gsl_complex *z, *znew; gsl_vector_complex *v, *vnew; gsl_matrix_complex *m, *mnew; size_t i, j; if (COMPLEX_P(obj)) { Data_Get_Struct(obj, gsl_complex, z); znew = xmalloc(sizeof(gsl_complex)); *znew = (*func)(*z); return Data_Wrap_Struct(cgsl_complex, 0, free, znew); } else if (VECTOR_COMPLEX_P(obj)) { Data_Get_Struct(obj, gsl_vector_complex, v); vnew = gsl_vector_complex_alloc(v->size); for (i = 0; i < v->size; i++) { z = GSL_COMPLEX_AT(v, i); gsl_vector_complex_set(vnew, i, (*func)(*z)); } return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew); } else if (MATRIX_COMPLEX_P(obj)) { Data_Get_Struct(obj, gsl_matrix_complex, m); mnew = gsl_matrix_complex_alloc(m->size1, m->size2); for (i = 0; i < m->size1; i++) { for (j = 0; j < m->size2; j++) { gsl_matrix_complex_set(mnew, i, j, (*func)(gsl_matrix_complex_get(m, i, j))); } } return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew); } else { rb_raise(rb_eTypeError, "wrong argument type %s " " (GSL::Complex or GSL::Vector::Complex expected)", rb_class2name(CLASS_OF(obj))); } }
static VALUE rb_gsl_sf_pow_int(VALUE obj, VALUE x, VALUE n) { VALUE argv[2]; if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) { argv[0] = x; argv[1] = n; return rb_gsl_complex_pow(2, argv, obj); } return rb_gsl_sf_eval_double_int(gsl_sf_pow_int, x, n); }
static VALUE rb_gsl_pow_int(VALUE obj, VALUE xx, VALUE nn) { VALUE x, ary, argv[2]; size_t i, j, size; int n; gsl_vector *v = NULL, *vnew = NULL; gsl_matrix *m = NULL, *mnew = NULL; if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx); switch (TYPE(xx)) { case T_FIXNUM: case T_BIGNUM: case T_FLOAT: return rb_float_new(gsl_pow_int(NUM2DBL(xx), FIX2INT(nn))); break; case T_ARRAY: CHECK_FIXNUM(nn); n = FIX2INT(nn); size = RARRAY_LEN(xx); ary = rb_ary_new2(size); for (i = 0; i < size; i++) { x = rb_ary_entry(xx, i); Need_Float(x); // rb_ary_store(ary, i, rb_float_new(gsl_pow_int(RFLOAT(x)->value, n))); rb_ary_store(ary, i, rb_float_new(gsl_pow_int(NUM2DBL(x), n))); } return ary; break; default: #ifdef HAVE_NARRAY_H if (NA_IsNArray(xx)) { struct NARRAY *na; double *ptr1, *ptr2; CHECK_FIXNUM(nn); n = FIX2INT(nn); GetNArray(xx, na); ptr1 = (double*) na->ptr; size = na->total; ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx)); ptr2 = NA_PTR_TYPE(ary, double*); for (i = 0; i < size; i++) ptr2[i] = gsl_pow_int(ptr1[i], n); return ary; } #endif if (VECTOR_P(xx)) { CHECK_FIXNUM(nn); n = FIX2INT(nn); Data_Get_Struct(xx, gsl_vector, v); vnew = gsl_vector_alloc(v->size); for (i = 0; i < v->size; i++) { gsl_vector_set(vnew, i, gsl_pow_int(gsl_vector_get(v, i), n)); } return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew); } else if (MATRIX_P(xx)) { CHECK_FIXNUM(nn); n = FIX2INT(nn); Data_Get_Struct(xx, gsl_matrix, m); mnew = gsl_matrix_alloc(m->size1, m->size2); for (i = 0; i < m->size1; i++) { for (j = 0; j < m->size2; j++) { gsl_matrix_set(mnew, i, j, gsl_pow_int(gsl_matrix_get(m, i, j), n)); } } return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew); } else if (COMPLEX_P(xx) || VECTOR_COMPLEX_P(xx) || MATRIX_COMPLEX_P(xx)) { argv[0] = xx; argv[1] = nn; return rb_gsl_complex_pow_real(2, argv, obj); } else { rb_raise(rb_eTypeError, "wrong argument type %s (Array or Vector or Matrix expected)", rb_class2name(CLASS_OF(xx))); } break; } /* never reach here */ return Qnil; }
static VALUE rb_gsl_atanh(VALUE obj, VALUE x) { if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) return rb_gsl_math_complex_eval(gsl_complex_arctanh, x); return rb_gsl_math_eval(gsl_atanh, x); }
static VALUE rb_gsl_sf_cos(VALUE obj, VALUE x) { if (COMPLEX_P(x) || VECTOR_COMPLEX_P(x) || MATRIX_COMPLEX_P(x)) return rb_gsl_math_complex_eval(gsl_complex_cos, x); return rb_gsl_sf_eval1(gsl_sf_cos, x); }