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); }
gsl_complex ary2complex(VALUE obj) { gsl_complex *z, c; switch (TYPE(obj)) { case T_ARRAY: GSL_SET_REAL(&c, NUM2DBL(rb_ary_entry(obj, 0))); GSL_SET_IMAG(&c, NUM2DBL(rb_ary_entry(obj, 1))); break; default: if (COMPLEX_P(obj)) { Data_Get_Struct(obj, gsl_complex, z); c = *z; } else { rb_raise(rb_eTypeError, "wrong argument type %s (Array or Complex expected)", rb_class2name(CLASS_OF(obj))); } break; } return c; }
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); }