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_nary_eval1(VALUE ary, double (*f)(double)) { VALUE ary2; struct NARRAY *na; double *ptr1, *ptr2; size_t i, n; ary = na_change_type(ary, NA_DFLOAT); GetNArray(ary, na); ptr1 = (double *) na->ptr; n = na->total; ary2 = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(ary)); ptr2 = NA_PTR_TYPE(ary2, double*); for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i]); return ary2; }
double* get_ptr_double3(VALUE obj, size_t *size, size_t *stride, int *flag) { gsl_vector *v; #ifdef HAVE_NARRAY_H double *ptr; struct NARRAY *na; if (NA_IsNArray(obj)) { obj = na_change_type(obj, NA_DFLOAT); GetNArray(obj, na); ptr = (double *) na->ptr; *size = na->total; *stride = 1; *flag = 1; return ptr; } #endif CHECK_VECTOR(obj); Data_Get_Struct(obj, gsl_vector, v); *size = v->size; *stride = v->stride; *flag = 0; return v->data; }