gsl 1.12.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +29 -0
- data/Rakefile +54 -0
- data/VERSION +2 -0
- data/ext/MANIFEST +119 -0
- data/ext/alf.c +206 -0
- data/ext/array.c +666 -0
- data/ext/array_complex.c +247 -0
- data/ext/blas.c +29 -0
- data/ext/blas1.c +731 -0
- data/ext/blas2.c +1093 -0
- data/ext/blas3.c +881 -0
- data/ext/block.c +44 -0
- data/ext/block_source.c +886 -0
- data/ext/bspline.c +130 -0
- data/ext/bundle.c +3 -0
- data/ext/cdf.c +754 -0
- data/ext/cheb.c +542 -0
- data/ext/combination.c +283 -0
- data/ext/common.c +325 -0
- data/ext/complex.c +1004 -0
- data/ext/const.c +673 -0
- data/ext/const_additional.c +120 -0
- data/ext/cqp.c +283 -0
- data/ext/deriv.c +195 -0
- data/ext/dht.c +361 -0
- data/ext/diff.c +166 -0
- data/ext/dirac.c +395 -0
- data/ext/eigen.c +2373 -0
- data/ext/error.c +194 -0
- data/ext/extconf.rb +281 -0
- data/ext/fcmp.c +66 -0
- data/ext/fft.c +1092 -0
- data/ext/fit.c +205 -0
- data/ext/fresnel.c +312 -0
- data/ext/function.c +524 -0
- data/ext/geometry.c +139 -0
- data/ext/graph.c +1638 -0
- data/ext/gsl.c +271 -0
- data/ext/gsl_narray.c +653 -0
- data/ext/histogram.c +1995 -0
- data/ext/histogram2d.c +1068 -0
- data/ext/histogram3d.c +884 -0
- data/ext/histogram3d_source.c +750 -0
- data/ext/histogram_find.c +101 -0
- data/ext/histogram_oper.c +159 -0
- data/ext/ieee.c +98 -0
- data/ext/integration.c +1138 -0
- data/ext/interp.c +512 -0
- data/ext/jacobi.c +739 -0
- data/ext/linalg.c +4047 -0
- data/ext/linalg_complex.c +741 -0
- data/ext/math.c +725 -0
- data/ext/matrix.c +39 -0
- data/ext/matrix_complex.c +1732 -0
- data/ext/matrix_double.c +560 -0
- data/ext/matrix_int.c +256 -0
- data/ext/matrix_source.c +2733 -0
- data/ext/min.c +250 -0
- data/ext/monte.c +992 -0
- data/ext/multifit.c +1879 -0
- data/ext/multimin.c +808 -0
- data/ext/multimin_fsdf.c +156 -0
- data/ext/multiroots.c +955 -0
- data/ext/ndlinear.c +321 -0
- data/ext/nmf.c +167 -0
- data/ext/nmf_wrap.c +72 -0
- data/ext/ntuple.c +469 -0
- data/ext/odeiv.c +959 -0
- data/ext/ool.c +879 -0
- data/ext/oper_complex_source.c +253 -0
- data/ext/permutation.c +596 -0
- data/ext/poly.c +42 -0
- data/ext/poly2.c +265 -0
- data/ext/poly_source.c +1885 -0
- data/ext/qrng.c +171 -0
- data/ext/randist.c +1873 -0
- data/ext/rational.c +480 -0
- data/ext/rng.c +612 -0
- data/ext/root.c +408 -0
- data/ext/sf.c +1494 -0
- data/ext/sf_airy.c +200 -0
- data/ext/sf_bessel.c +867 -0
- data/ext/sf_clausen.c +28 -0
- data/ext/sf_coulomb.c +206 -0
- data/ext/sf_coupling.c +118 -0
- data/ext/sf_dawson.c +29 -0
- data/ext/sf_debye.c +157 -0
- data/ext/sf_dilog.c +42 -0
- data/ext/sf_elementary.c +44 -0
- data/ext/sf_ellint.c +206 -0
- data/ext/sf_elljac.c +29 -0
- data/ext/sf_erfc.c +93 -0
- data/ext/sf_exp.c +164 -0
- data/ext/sf_expint.c +211 -0
- data/ext/sf_fermi_dirac.c +148 -0
- data/ext/sf_gamma.c +344 -0
- data/ext/sf_gegenbauer.c +96 -0
- data/ext/sf_hyperg.c +197 -0
- data/ext/sf_laguerre.c +112 -0
- data/ext/sf_lambert.c +47 -0
- data/ext/sf_legendre.c +367 -0
- data/ext/sf_log.c +104 -0
- data/ext/sf_mathieu.c +238 -0
- data/ext/sf_power.c +46 -0
- data/ext/sf_psi.c +98 -0
- data/ext/sf_synchrotron.c +48 -0
- data/ext/sf_transport.c +76 -0
- data/ext/sf_trigonometric.c +207 -0
- data/ext/sf_zeta.c +119 -0
- data/ext/signal.c +310 -0
- data/ext/siman.c +718 -0
- data/ext/sort.c +208 -0
- data/ext/spline.c +395 -0
- data/ext/stats.c +799 -0
- data/ext/sum.c +168 -0
- data/ext/tamu_anova.c +56 -0
- data/ext/tensor.c +38 -0
- data/ext/tensor_source.c +1123 -0
- data/ext/vector.c +38 -0
- data/ext/vector_complex.c +2236 -0
- data/ext/vector_double.c +1433 -0
- data/ext/vector_int.c +204 -0
- data/ext/vector_source.c +3329 -0
- data/ext/wavelet.c +937 -0
- data/include/rb_gsl.h +151 -0
- data/include/rb_gsl_array.h +238 -0
- data/include/rb_gsl_cheb.h +21 -0
- data/include/rb_gsl_common.h +343 -0
- data/include/rb_gsl_complex.h +25 -0
- data/include/rb_gsl_const.h +29 -0
- data/include/rb_gsl_dirac.h +13 -0
- data/include/rb_gsl_eigen.h +17 -0
- data/include/rb_gsl_fft.h +62 -0
- data/include/rb_gsl_fit.h +25 -0
- data/include/rb_gsl_function.h +27 -0
- data/include/rb_gsl_graph.h +70 -0
- data/include/rb_gsl_histogram.h +63 -0
- data/include/rb_gsl_histogram3d.h +97 -0
- data/include/rb_gsl_integration.h +17 -0
- data/include/rb_gsl_interp.h +46 -0
- data/include/rb_gsl_linalg.h +25 -0
- data/include/rb_gsl_math.h +26 -0
- data/include/rb_gsl_odeiv.h +21 -0
- data/include/rb_gsl_poly.h +71 -0
- data/include/rb_gsl_rational.h +37 -0
- data/include/rb_gsl_rng.h +21 -0
- data/include/rb_gsl_root.h +22 -0
- data/include/rb_gsl_sf.h +119 -0
- data/include/rb_gsl_statistics.h +17 -0
- data/include/rb_gsl_tensor.h +45 -0
- data/include/rb_gsl_with_narray.h +22 -0
- data/include/templates_off.h +87 -0
- data/include/templates_on.h +241 -0
- data/lib/gsl/gnuplot.rb +41 -0
- data/lib/gsl/oper.rb +68 -0
- data/lib/ool.rb +22 -0
- data/lib/ool/conmin.rb +30 -0
- metadata +224 -0
data/ext/wavelet.c
ADDED
|
@@ -0,0 +1,937 @@
|
|
|
1
|
+
/*
|
|
2
|
+
wavelet.c
|
|
3
|
+
Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
|
|
4
|
+
(C) Copyright 2004 by Yoshiki Tsunesada
|
|
5
|
+
|
|
6
|
+
Ruby/GSL is free software: you can redistribute it and/or modify it
|
|
7
|
+
under the terms of the GNU General Public License.
|
|
8
|
+
This library is distributed in the hope that it will be useful, but
|
|
9
|
+
WITHOUT ANY WARRANTY.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
#include "rb_gsl_config.h"
|
|
13
|
+
#include "rb_gsl_array.h"
|
|
14
|
+
#include "rb_gsl_common.h"
|
|
15
|
+
|
|
16
|
+
#ifdef GSL_1_6_LATER
|
|
17
|
+
#include <gsl/gsl_wavelet.h>
|
|
18
|
+
#include <gsl/gsl_wavelet2d.h>
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
#ifdef HAVE_NARRAY_H
|
|
22
|
+
#include "narray.h"
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
#ifndef CHECK_WAVELET
|
|
26
|
+
#define CHECK_WAVELET(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet))\
|
|
27
|
+
rb_raise(rb_eTypeError, "wrong argument type (Wavelet expected)");
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
#ifndef CHECK_WORKSPACE
|
|
31
|
+
#define CHECK_WORKSPACE(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet_workspace))\
|
|
32
|
+
rb_raise(rb_eTypeError, "wrong argument type (Wavelet::Workspace expected)");
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
enum RB_GSL_DWT {
|
|
36
|
+
RB_GSL_DWT_COPY,
|
|
37
|
+
RB_GSL_DWT_INPLACE,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
static VALUE cgsl_wavelet;
|
|
41
|
+
|
|
42
|
+
enum {
|
|
43
|
+
GSL_WAVELET_DAUBECHIES,
|
|
44
|
+
GSL_WAVELET_DAUBECHIES_CENTERED,
|
|
45
|
+
GSL_WAVELET_HAAR,
|
|
46
|
+
GSL_WAVELET_HAAR_CENTERED,
|
|
47
|
+
GSL_WAVELET_BSPLINE,
|
|
48
|
+
GSL_WAVELET_BSPLINE_CENTERED,
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
#ifdef GSL_1_6_LATER
|
|
52
|
+
static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t);
|
|
53
|
+
static VALUE cgsl_wavelet_workspace;
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
static VALUE rb_gsl_wavelet_new(VALUE klass, VALUE t, VALUE m)
|
|
57
|
+
{
|
|
58
|
+
#ifdef GSL_1_6_LATER
|
|
59
|
+
const gsl_wavelet_type *T;
|
|
60
|
+
size_t member;
|
|
61
|
+
gsl_wavelet *w = NULL;
|
|
62
|
+
CHECK_FIXNUM(m);
|
|
63
|
+
T = rb_gsl_wavelet_get_type(t);
|
|
64
|
+
member = FIX2INT(m);
|
|
65
|
+
w = gsl_wavelet_alloc(T, member);
|
|
66
|
+
if (w == NULL) rb_raise(rb_eNoMemError, "gsl_wavelet_alloc failed");
|
|
67
|
+
return Data_Wrap_Struct(klass, 0, gsl_wavelet_free, w);
|
|
68
|
+
#else
|
|
69
|
+
rb_raise(rb_eNotImpError, "Wavelet transforms not supported in GSL-%s, use GSL-1.6 or later", GSL_VERSION);
|
|
70
|
+
return Qnil;
|
|
71
|
+
#endif
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#ifdef GSL_1_6_LATER
|
|
75
|
+
static const gsl_wavelet_type* rb_gsl_wavelet_get_type_str(char *name);
|
|
76
|
+
static const gsl_wavelet_type* rb_gsl_wavelet_get_type_int(int t);
|
|
77
|
+
static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t)
|
|
78
|
+
{
|
|
79
|
+
const gsl_wavelet_type *T;
|
|
80
|
+
switch (TYPE(t)) {
|
|
81
|
+
case T_STRING:
|
|
82
|
+
T = rb_gsl_wavelet_get_type_str(STR2CSTR(t));
|
|
83
|
+
break;
|
|
84
|
+
case T_FIXNUM:
|
|
85
|
+
T = rb_gsl_wavelet_get_type_int(FIX2INT(t));
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
rb_raise(rb_eTypeError,
|
|
89
|
+
"wrong type of argument %s (String or Fixnum expected)",
|
|
90
|
+
rb_class2name(CLASS_OF(t)));
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
return T;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static const gsl_wavelet_type* rb_gsl_wavelet_get_type_str(char *name)
|
|
97
|
+
{
|
|
98
|
+
const gsl_wavelet_type *T;
|
|
99
|
+
if (str_tail_grep(name, "daubechies") == 0)
|
|
100
|
+
T = gsl_wavelet_daubechies;
|
|
101
|
+
else if (str_tail_grep(name, "daubechies_centered") == 0)
|
|
102
|
+
T = gsl_wavelet_daubechies_centered;
|
|
103
|
+
else if (str_tail_grep(name, "haar") == 0)
|
|
104
|
+
T = gsl_wavelet_haar;
|
|
105
|
+
else if (str_tail_grep(name, "haar_centered") == 0)
|
|
106
|
+
T = gsl_wavelet_haar_centered;
|
|
107
|
+
else if (str_tail_grep(name, "bspline") == 0)
|
|
108
|
+
T = gsl_wavelet_bspline;
|
|
109
|
+
else if (str_tail_grep(name, "bspline_centered") == 0)
|
|
110
|
+
T = gsl_wavelet_bspline_centered;
|
|
111
|
+
else
|
|
112
|
+
rb_raise(rb_eArgError, "unknown type %s", name);
|
|
113
|
+
return T;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static const gsl_wavelet_type* rb_gsl_wavelet_get_type_int(int t)
|
|
117
|
+
{
|
|
118
|
+
const gsl_wavelet_type *T;
|
|
119
|
+
switch (t) {
|
|
120
|
+
case GSL_WAVELET_DAUBECHIES:
|
|
121
|
+
T = gsl_wavelet_daubechies;
|
|
122
|
+
break;
|
|
123
|
+
case GSL_WAVELET_DAUBECHIES_CENTERED:
|
|
124
|
+
T = gsl_wavelet_daubechies_centered;
|
|
125
|
+
break;
|
|
126
|
+
case GSL_WAVELET_HAAR:
|
|
127
|
+
T = gsl_wavelet_haar;
|
|
128
|
+
break;
|
|
129
|
+
case GSL_WAVELET_HAAR_CENTERED:
|
|
130
|
+
T = gsl_wavelet_haar_centered;
|
|
131
|
+
break;
|
|
132
|
+
case GSL_WAVELET_BSPLINE:
|
|
133
|
+
T = gsl_wavelet_bspline;
|
|
134
|
+
break;
|
|
135
|
+
case GSL_WAVELET_BSPLINE_CENTERED:
|
|
136
|
+
T = gsl_wavelet_bspline_centered;
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
rb_raise(rb_eArgError, "unknown type %d", t);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
return T;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
static void rb_gsl_wavelet_define_const(VALUE klass);
|
|
146
|
+
static void rb_gsl_wavelet_define_const(VALUE klass)
|
|
147
|
+
{
|
|
148
|
+
rb_define_const(klass, "DAUBECHIES", INT2FIX(GSL_WAVELET_DAUBECHIES));
|
|
149
|
+
rb_define_const(klass, "DAUBECHIES_CENTERED", INT2FIX(GSL_WAVELET_DAUBECHIES_CENTERED));
|
|
150
|
+
rb_define_const(klass, "HAAR", INT2FIX(GSL_WAVELET_HAAR));
|
|
151
|
+
rb_define_const(klass, "HAAR_CENTERED", INT2FIX(GSL_WAVELET_HAAR_CENTERED));
|
|
152
|
+
rb_define_const(klass, "BSPLINE", INT2FIX(GSL_WAVELET_BSPLINE));
|
|
153
|
+
rb_define_const(klass, "BSPLINE_CENTERED", INT2FIX(GSL_WAVELET_BSPLINE_CENTERED));
|
|
154
|
+
/*****/
|
|
155
|
+
rb_define_const(klass, "FORWARD", INT2FIX(forward));
|
|
156
|
+
rb_define_const(klass, "Forward", INT2FIX(forward));
|
|
157
|
+
rb_define_const(klass, "BACKWARD", INT2FIX(backward));
|
|
158
|
+
rb_define_const(klass, "Backward", INT2FIX(backward));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static VALUE rb_gsl_wavelet_name(VALUE ww)
|
|
162
|
+
{
|
|
163
|
+
gsl_wavelet *w = NULL;
|
|
164
|
+
Data_Get_Struct(ww, gsl_wavelet, w);
|
|
165
|
+
return rb_str_new2(gsl_wavelet_name(w));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
static VALUE rb_gsl_wavelet_workspace_new(VALUE klass, VALUE nn)
|
|
169
|
+
{
|
|
170
|
+
gsl_wavelet_workspace *wspace = NULL;
|
|
171
|
+
CHECK_FIXNUM(nn);
|
|
172
|
+
wspace = gsl_wavelet_workspace_alloc(FIX2INT(nn));
|
|
173
|
+
if (wspace == NULL) rb_raise(rb_eNoMemError, "gsl_wavelet_workspace_alloc failed");
|
|
174
|
+
return Data_Wrap_Struct(klass, 0, gsl_wavelet_workspace_free, wspace);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
|
|
178
|
+
int (*trans)(const gsl_wavelet *,
|
|
179
|
+
gsl_matrix *,
|
|
180
|
+
gsl_wavelet_workspace *),
|
|
181
|
+
int sss);
|
|
182
|
+
static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
|
|
183
|
+
int (*trans)(const gsl_wavelet *,
|
|
184
|
+
gsl_matrix *,
|
|
185
|
+
gsl_wavelet_direction,
|
|
186
|
+
gsl_wavelet_workspace *),
|
|
187
|
+
int sss);
|
|
188
|
+
|
|
189
|
+
static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
|
|
190
|
+
int sss)
|
|
191
|
+
{
|
|
192
|
+
gsl_wavelet *w = NULL;
|
|
193
|
+
gsl_vector *v = NULL, *vnew;
|
|
194
|
+
gsl_wavelet_direction dir = forward;
|
|
195
|
+
gsl_wavelet_workspace *work = NULL;
|
|
196
|
+
int itmp, flag = 0, status;
|
|
197
|
+
double *ptr1, *ptr2;
|
|
198
|
+
size_t n, stride;
|
|
199
|
+
int naflag = 0;
|
|
200
|
+
VALUE ary, ret;
|
|
201
|
+
#ifdef HAVE_NARRAY_H
|
|
202
|
+
struct NARRAY *na1 = NULL;
|
|
203
|
+
#endif
|
|
204
|
+
|
|
205
|
+
switch (TYPE(obj)) {
|
|
206
|
+
case T_MODULE:
|
|
207
|
+
case T_CLASS:
|
|
208
|
+
case T_OBJECT:
|
|
209
|
+
if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
|
|
210
|
+
CHECK_WAVELET(argv[0]);
|
|
211
|
+
|
|
212
|
+
if (MATRIX_P(argv[1])) {
|
|
213
|
+
return rb_gsl_wavelet2d(argc, argv, obj,
|
|
214
|
+
gsl_wavelet2d_transform_matrix, sss);
|
|
215
|
+
}
|
|
216
|
+
if (VECTOR_P(argv[1])) {
|
|
217
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
218
|
+
Data_Get_Struct(argv[1], gsl_vector, v);
|
|
219
|
+
ret = argv[1];
|
|
220
|
+
ptr1 = v->data;
|
|
221
|
+
n = v->size;
|
|
222
|
+
stride = v->stride;
|
|
223
|
+
#ifdef HAVE_NARRAY_H
|
|
224
|
+
} else if (NA_IsNArray(argv[1])) {
|
|
225
|
+
GetNArray(argv[1], na1);
|
|
226
|
+
ret = argv[1];
|
|
227
|
+
ptr1 = (double*) na1->ptr;
|
|
228
|
+
n = na1->total;
|
|
229
|
+
naflag = 1;
|
|
230
|
+
stride = 1;
|
|
231
|
+
#endif
|
|
232
|
+
} else {
|
|
233
|
+
rb_raise(rb_eTypeError, "wrong argument type (Vector expected)");
|
|
234
|
+
}
|
|
235
|
+
itmp = 2;
|
|
236
|
+
break;
|
|
237
|
+
default:
|
|
238
|
+
if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
|
|
239
|
+
|
|
240
|
+
if (MATRIX_P(argv[0])) {
|
|
241
|
+
return rb_gsl_wavelet2d(argc, argv, obj,
|
|
242
|
+
gsl_wavelet2d_transform_matrix, sss);
|
|
243
|
+
}
|
|
244
|
+
if (VECTOR_P(obj)) {
|
|
245
|
+
CHECK_WAVELET(argv[0]);
|
|
246
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
247
|
+
Data_Get_Struct(obj, gsl_vector, v);
|
|
248
|
+
ret = obj;
|
|
249
|
+
ptr1 = v->data;
|
|
250
|
+
n = v->size;
|
|
251
|
+
stride = v->stride;
|
|
252
|
+
} else if (VECTOR_P(argv[0])) {
|
|
253
|
+
|
|
254
|
+
CHECK_WAVELET(obj);
|
|
255
|
+
Data_Get_Struct(obj, gsl_wavelet, w);
|
|
256
|
+
Data_Get_Struct(argv[0], gsl_vector, v);
|
|
257
|
+
ret = argv[0];
|
|
258
|
+
ptr1 = v->data;
|
|
259
|
+
n = v->size;
|
|
260
|
+
stride = v->stride;
|
|
261
|
+
#ifdef HAVE_NARRAY_H
|
|
262
|
+
} else if (NA_IsNArray(obj)) {
|
|
263
|
+
CHECK_WAVELET(argv[0]);
|
|
264
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
265
|
+
GetNArray(obj, na1);
|
|
266
|
+
ret = obj;
|
|
267
|
+
ptr1 = (double*) na1->ptr;
|
|
268
|
+
n = na1->total;
|
|
269
|
+
naflag = 1;
|
|
270
|
+
stride = 1;
|
|
271
|
+
} else if (NA_IsNArray(argv[0])) {
|
|
272
|
+
CHECK_WAVELET(obj);
|
|
273
|
+
Data_Get_Struct(obj, gsl_wavelet, w);
|
|
274
|
+
GetNArray(argv[0], na1);
|
|
275
|
+
ret = argv[0];
|
|
276
|
+
ptr1 = (double*) na1->ptr;
|
|
277
|
+
n = na1->total;
|
|
278
|
+
naflag = 1;
|
|
279
|
+
stride = 1;
|
|
280
|
+
#endif
|
|
281
|
+
} else {
|
|
282
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
283
|
+
}
|
|
284
|
+
itmp = 1;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
switch (argc - itmp) {
|
|
288
|
+
case 2:
|
|
289
|
+
CHECK_FIXNUM(argv[itmp]);
|
|
290
|
+
CHECK_WORKSPACE(argv[itmp+1]);
|
|
291
|
+
dir = FIX2INT(argv[itmp]);
|
|
292
|
+
Data_Get_Struct(argv[itmp+1], gsl_wavelet_workspace, work);
|
|
293
|
+
break;
|
|
294
|
+
case 1:
|
|
295
|
+
if (TYPE(argv[itmp]) == T_FIXNUM) {
|
|
296
|
+
dir = FIX2INT(argv[itmp]);
|
|
297
|
+
work = gsl_wavelet_workspace_alloc(v->size);
|
|
298
|
+
flag = 1;
|
|
299
|
+
} else if (rb_obj_is_kind_of(argv[itmp], cgsl_wavelet_workspace)) {
|
|
300
|
+
Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
|
|
301
|
+
} else {
|
|
302
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
case 0:
|
|
306
|
+
work = gsl_wavelet_workspace_alloc(v->size);
|
|
307
|
+
flag = 1;
|
|
308
|
+
break;
|
|
309
|
+
default:
|
|
310
|
+
rb_raise(rb_eArgError, "too many arguments");
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
if (naflag == 0) {
|
|
314
|
+
if (sss == RB_GSL_DWT_COPY) {
|
|
315
|
+
vnew = gsl_vector_alloc(v->size);
|
|
316
|
+
gsl_vector_memcpy(vnew, v);
|
|
317
|
+
ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
|
318
|
+
ptr2 = vnew->data;
|
|
319
|
+
} else {
|
|
320
|
+
ary = ret;
|
|
321
|
+
ptr2 = ptr1;
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
#ifdef HAVE_NARRAY_H
|
|
325
|
+
if (sss == RB_GSL_DWT_COPY) {
|
|
326
|
+
ary = na_make_object(NA_DFLOAT, na1->rank, na1->shape, cNArray);
|
|
327
|
+
ptr2 = NA_PTR_TYPE(ary, double*);
|
|
328
|
+
memcpy(ptr2, ptr1, sizeof(double)*n);
|
|
329
|
+
} else {
|
|
330
|
+
ary = ret;
|
|
331
|
+
ptr2 = ptr1;
|
|
332
|
+
}
|
|
333
|
+
#endif
|
|
334
|
+
}
|
|
335
|
+
status = gsl_wavelet_transform(w, ptr2, stride, n, dir, work);
|
|
336
|
+
if (flag) gsl_wavelet_workspace_free(work);
|
|
337
|
+
return ary;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
static VALUE rb_gsl_wavelet_transform(int argc, VALUE *argv, VALUE obj)
|
|
341
|
+
{
|
|
342
|
+
return rb_gsl_wavelet_transform0(argc, argv, obj, RB_GSL_DWT_COPY);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
static VALUE rb_gsl_wavelet_transform2(int argc, VALUE *argv, VALUE obj)
|
|
346
|
+
{
|
|
347
|
+
return rb_gsl_wavelet_transform0(argc, argv, obj, RB_GSL_DWT_INPLACE);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
|
|
351
|
+
int (*trans)(const gsl_wavelet *,
|
|
352
|
+
double *, size_t, size_t,
|
|
353
|
+
gsl_wavelet_workspace *),
|
|
354
|
+
int sss)
|
|
355
|
+
{
|
|
356
|
+
gsl_wavelet *w = NULL;
|
|
357
|
+
gsl_vector *v = NULL, *vnew;
|
|
358
|
+
gsl_wavelet_workspace *work = NULL;
|
|
359
|
+
int itmp, flag = 0, status, naflag = 0;
|
|
360
|
+
double *ptr1 = NULL, *ptr2 = NULL;
|
|
361
|
+
size_t n, stride;
|
|
362
|
+
VALUE ary, ret;
|
|
363
|
+
#ifdef HAVE_NARRAY_H
|
|
364
|
+
struct NARRAY *na;
|
|
365
|
+
#endif
|
|
366
|
+
switch (TYPE(obj)) {
|
|
367
|
+
case T_MODULE:
|
|
368
|
+
case T_CLASS:
|
|
369
|
+
case T_OBJECT:
|
|
370
|
+
if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
|
|
371
|
+
CHECK_WAVELET(argv[0]);
|
|
372
|
+
|
|
373
|
+
if (MATRIX_P(argv[1])) {
|
|
374
|
+
if (trans == gsl_wavelet_transform_forward) {
|
|
375
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
376
|
+
gsl_wavelet2d_transform_matrix_forward, sss);
|
|
377
|
+
} else {
|
|
378
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
379
|
+
gsl_wavelet2d_transform_matrix_inverse, sss);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (VECTOR_P(argv[1])) {
|
|
383
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
384
|
+
Data_Get_Struct(argv[1], gsl_vector, v);
|
|
385
|
+
ret = argv[1];
|
|
386
|
+
ptr1 = v->data;
|
|
387
|
+
n = v->size;
|
|
388
|
+
stride = v->stride;
|
|
389
|
+
#ifdef HAVE_NARRAY_H
|
|
390
|
+
} else if (NA_IsNArray(argv[1])) {
|
|
391
|
+
GetNArray(argv[1], na);
|
|
392
|
+
ret = argv[1];
|
|
393
|
+
ptr1 = (double*) na->ptr;
|
|
394
|
+
n = na->total;
|
|
395
|
+
naflag = 1;
|
|
396
|
+
stride = 1;
|
|
397
|
+
#endif
|
|
398
|
+
} else {
|
|
399
|
+
rb_raise(rb_eTypeError, "wrong argument type (Vector expected)");
|
|
400
|
+
}
|
|
401
|
+
itmp = 2;
|
|
402
|
+
break;
|
|
403
|
+
default:
|
|
404
|
+
if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
|
|
405
|
+
|
|
406
|
+
if (MATRIX_P(argv[0])) {
|
|
407
|
+
if (trans == gsl_wavelet_transform_forward) {
|
|
408
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
409
|
+
gsl_wavelet2d_transform_matrix_forward, sss);
|
|
410
|
+
} else {
|
|
411
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
412
|
+
gsl_wavelet2d_transform_matrix_inverse, sss);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
if (VECTOR_P(obj)) {
|
|
416
|
+
CHECK_WAVELET(argv[0]);
|
|
417
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
418
|
+
Data_Get_Struct(obj, gsl_vector, v);
|
|
419
|
+
ret = obj;
|
|
420
|
+
ptr1 = v->data;
|
|
421
|
+
n = v->size;
|
|
422
|
+
stride = v->stride;
|
|
423
|
+
} else if (VECTOR_P(argv[0])) {
|
|
424
|
+
CHECK_WAVELET(obj);
|
|
425
|
+
Data_Get_Struct(obj, gsl_wavelet, w);
|
|
426
|
+
Data_Get_Struct(argv[0], gsl_vector, v);
|
|
427
|
+
ret = argv[0];
|
|
428
|
+
ptr1 = v->data;
|
|
429
|
+
n = v->size;
|
|
430
|
+
stride = v->stride;
|
|
431
|
+
#ifdef HAVE_NARRAY_H
|
|
432
|
+
} else if (NA_IsNArray(obj)) {
|
|
433
|
+
CHECK_WAVELET(argv[0]);
|
|
434
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
435
|
+
GetNArray(obj, na);
|
|
436
|
+
ret = obj;
|
|
437
|
+
ptr1 = (double*) na->ptr;
|
|
438
|
+
n = na->total;
|
|
439
|
+
naflag = 1;
|
|
440
|
+
stride = 1;
|
|
441
|
+
} else if (NA_IsNArray(argv[0])) {
|
|
442
|
+
CHECK_WAVELET(obj);
|
|
443
|
+
Data_Get_Struct(obj, gsl_wavelet, w);
|
|
444
|
+
GetNArray(argv[0], na);
|
|
445
|
+
ret = argv[0];
|
|
446
|
+
ptr1 = (double*) na->ptr;
|
|
447
|
+
n = na->total;
|
|
448
|
+
naflag = 1;
|
|
449
|
+
stride = 1;
|
|
450
|
+
#endif
|
|
451
|
+
} else {
|
|
452
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
453
|
+
}
|
|
454
|
+
itmp = 1;
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
switch (argc - itmp) {
|
|
458
|
+
case 1:
|
|
459
|
+
CHECK_WORKSPACE(argv[itmp]);
|
|
460
|
+
Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
|
|
461
|
+
break;
|
|
462
|
+
case 0:
|
|
463
|
+
work = gsl_wavelet_workspace_alloc(v->size);
|
|
464
|
+
flag = 1;
|
|
465
|
+
break;
|
|
466
|
+
default:
|
|
467
|
+
rb_raise(rb_eArgError, "too many arguments");
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
if (naflag == 0) {
|
|
471
|
+
if (sss == RB_GSL_DWT_COPY) {
|
|
472
|
+
vnew = gsl_vector_alloc(v->size);
|
|
473
|
+
gsl_vector_memcpy(vnew, v);
|
|
474
|
+
ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
|
475
|
+
ptr2 = vnew->data;
|
|
476
|
+
} else {
|
|
477
|
+
ptr2 = ptr1;
|
|
478
|
+
ary = ret;
|
|
479
|
+
}
|
|
480
|
+
} else {
|
|
481
|
+
#ifdef HAVA_NARRAY_H
|
|
482
|
+
if (sss == RB_GSL_DWT_COPY) {
|
|
483
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, cNArray);
|
|
484
|
+
ptr2 = NA_PTR_TYPE(ary, double*);
|
|
485
|
+
memcpy(ptr2, ptr1, sizeof(double)*n);
|
|
486
|
+
} else {
|
|
487
|
+
ptr2 = ptr1;
|
|
488
|
+
ary = ret;
|
|
489
|
+
}
|
|
490
|
+
#endif
|
|
491
|
+
}
|
|
492
|
+
status = (*trans)(w, ptr2, stride, n, work);
|
|
493
|
+
if (flag) gsl_wavelet_workspace_free(work);
|
|
494
|
+
return ary;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
static VALUE rb_gsl_wavelet_transform_forward(int argc, VALUE *argv, VALUE obj)
|
|
498
|
+
{
|
|
499
|
+
return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_forward,
|
|
500
|
+
RB_GSL_DWT_COPY);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
static VALUE rb_gsl_wavelet_transform_inverse(int argc, VALUE *argv, VALUE obj)
|
|
504
|
+
{
|
|
505
|
+
return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_inverse,
|
|
506
|
+
RB_GSL_DWT_COPY);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
static VALUE rb_gsl_wavelet_transform_forward2(int argc, VALUE *argv, VALUE obj)
|
|
510
|
+
{
|
|
511
|
+
return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_forward,
|
|
512
|
+
RB_GSL_DWT_INPLACE);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
static VALUE rb_gsl_wavelet_transform_inverse2(int argc, VALUE *argv, VALUE obj)
|
|
516
|
+
{
|
|
517
|
+
return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_inverse,
|
|
518
|
+
RB_GSL_DWT_INPLACE);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
|
|
522
|
+
int (*trans)(const gsl_wavelet *,
|
|
523
|
+
gsl_matrix *,
|
|
524
|
+
gsl_wavelet_direction,
|
|
525
|
+
gsl_wavelet_workspace *),
|
|
526
|
+
int sss)
|
|
527
|
+
{
|
|
528
|
+
gsl_wavelet *w = NULL;
|
|
529
|
+
gsl_matrix *m = NULL, *mnew;
|
|
530
|
+
gsl_wavelet_direction dir = forward;
|
|
531
|
+
gsl_wavelet_workspace *work = NULL;
|
|
532
|
+
VALUE ary, ret;
|
|
533
|
+
int itmp, flag = 0, status;
|
|
534
|
+
switch (TYPE(obj)) {
|
|
535
|
+
case T_MODULE:
|
|
536
|
+
case T_CLASS:
|
|
537
|
+
case T_OBJECT:
|
|
538
|
+
if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
|
|
539
|
+
CHECK_WAVELET(argv[0]);
|
|
540
|
+
CHECK_MATRIX(argv[1]);
|
|
541
|
+
ret = argv[1];
|
|
542
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
543
|
+
Data_Get_Struct(argv[1], gsl_matrix, m);
|
|
544
|
+
itmp = 2;
|
|
545
|
+
break;
|
|
546
|
+
default:
|
|
547
|
+
if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
|
|
548
|
+
if (MATRIX_P(obj)) {
|
|
549
|
+
CHECK_WAVELET(argv[0]);
|
|
550
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
551
|
+
Data_Get_Struct(obj, gsl_matrix, m);
|
|
552
|
+
ret = obj;
|
|
553
|
+
} else {
|
|
554
|
+
CHECK_MATRIX(argv[0]);
|
|
555
|
+
Data_Get_Struct(obj, gsl_wavelet, w);
|
|
556
|
+
Data_Get_Struct(argv[0], gsl_matrix, m);
|
|
557
|
+
ret = argv[0];
|
|
558
|
+
}
|
|
559
|
+
itmp = 1;
|
|
560
|
+
break;
|
|
561
|
+
}
|
|
562
|
+
switch (argc - itmp) {
|
|
563
|
+
case 2:
|
|
564
|
+
CHECK_FIXNUM(argv[itmp]);
|
|
565
|
+
CHECK_WORKSPACE(argv[itmp+1]);
|
|
566
|
+
dir = FIX2INT(argv[itmp]);
|
|
567
|
+
Data_Get_Struct(argv[itmp+1], gsl_wavelet_workspace, work);
|
|
568
|
+
break;
|
|
569
|
+
case 1:
|
|
570
|
+
if (TYPE(argv[itmp]) == T_FIXNUM) {
|
|
571
|
+
dir = FIX2INT(argv[itmp]);
|
|
572
|
+
work = gsl_wavelet_workspace_alloc(m->size1);
|
|
573
|
+
flag = 1;
|
|
574
|
+
} else if (rb_obj_is_kind_of(argv[itmp], cgsl_wavelet_workspace)) {
|
|
575
|
+
Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
|
|
576
|
+
} else {
|
|
577
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
578
|
+
}
|
|
579
|
+
break;
|
|
580
|
+
case 0:
|
|
581
|
+
work = gsl_wavelet_workspace_alloc(m->size1);
|
|
582
|
+
flag = 1;
|
|
583
|
+
break;
|
|
584
|
+
default:
|
|
585
|
+
rb_raise(rb_eArgError, "too many arguments");
|
|
586
|
+
break;
|
|
587
|
+
}
|
|
588
|
+
if (sss == RB_GSL_DWT_COPY) {
|
|
589
|
+
mnew = make_matrix_clone(m);
|
|
590
|
+
ary = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
|
591
|
+
} else {
|
|
592
|
+
mnew = m;
|
|
593
|
+
ary = ret;
|
|
594
|
+
}
|
|
595
|
+
status = (*trans)(w, mnew, dir, work);
|
|
596
|
+
if (flag) gsl_wavelet_workspace_free(work);
|
|
597
|
+
return ary;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
static VALUE rb_gsl_wavelet2d_transform_matrix(int argc, VALUE *argv, VALUE obj)
|
|
601
|
+
{
|
|
602
|
+
return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_transform_matrix,
|
|
603
|
+
RB_GSL_DWT_COPY);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
static VALUE rb_gsl_wavelet2d_transform_matrix2(int argc, VALUE *argv, VALUE obj)
|
|
607
|
+
{
|
|
608
|
+
return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_transform_matrix,
|
|
609
|
+
RB_GSL_DWT_INPLACE);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
|
|
613
|
+
int (*trans)(const gsl_wavelet *,
|
|
614
|
+
gsl_matrix *,
|
|
615
|
+
gsl_wavelet_workspace *),
|
|
616
|
+
int sss)
|
|
617
|
+
{
|
|
618
|
+
gsl_wavelet *w = NULL;
|
|
619
|
+
gsl_matrix *m = NULL, *mnew;
|
|
620
|
+
gsl_wavelet_workspace *work = NULL;
|
|
621
|
+
VALUE ary, ret;
|
|
622
|
+
int itmp, flag = 0, status;
|
|
623
|
+
switch (TYPE(obj)) {
|
|
624
|
+
case T_MODULE:
|
|
625
|
+
case T_CLASS:
|
|
626
|
+
case T_OBJECT:
|
|
627
|
+
if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
|
|
628
|
+
CHECK_WAVELET(argv[0]);
|
|
629
|
+
CHECK_MATRIX(argv[1]);
|
|
630
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
631
|
+
Data_Get_Struct(argv[1], gsl_matrix, m);
|
|
632
|
+
ret = argv[1];
|
|
633
|
+
itmp = 2;
|
|
634
|
+
break;
|
|
635
|
+
default:
|
|
636
|
+
if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
|
|
637
|
+
if (MATRIX_P(obj)) {
|
|
638
|
+
CHECK_WAVELET(argv[0]);
|
|
639
|
+
Data_Get_Struct(argv[0], gsl_wavelet, w);
|
|
640
|
+
Data_Get_Struct(obj, gsl_matrix, m);
|
|
641
|
+
ret = obj;
|
|
642
|
+
} else {
|
|
643
|
+
CHECK_MATRIX(argv[0]);
|
|
644
|
+
Data_Get_Struct(obj, gsl_wavelet, w);
|
|
645
|
+
Data_Get_Struct(argv[0], gsl_matrix, m);
|
|
646
|
+
ret = argv[0];
|
|
647
|
+
}
|
|
648
|
+
itmp = 1;
|
|
649
|
+
break;
|
|
650
|
+
}
|
|
651
|
+
switch (argc - itmp) {
|
|
652
|
+
case 1:
|
|
653
|
+
CHECK_WORKSPACE(argv[itmp]);
|
|
654
|
+
Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
|
|
655
|
+
break;
|
|
656
|
+
case 0:
|
|
657
|
+
work = gsl_wavelet_workspace_alloc(m->size1);
|
|
658
|
+
flag = 1;
|
|
659
|
+
break;
|
|
660
|
+
default:
|
|
661
|
+
rb_raise(rb_eArgError, "too many arguments");
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
664
|
+
if (sss == RB_GSL_DWT_COPY) {
|
|
665
|
+
mnew = make_matrix_clone(m);
|
|
666
|
+
ary = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
|
667
|
+
} else {
|
|
668
|
+
mnew = m;
|
|
669
|
+
ary = ret;
|
|
670
|
+
}
|
|
671
|
+
status = (*trans)(w, mnew, work);
|
|
672
|
+
if (flag) gsl_wavelet_workspace_free(work);
|
|
673
|
+
return ary;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
static VALUE rb_gsl_wavelet2d_transform_matrix_forward(int argc, VALUE *argv, VALUE obj)
|
|
677
|
+
{
|
|
678
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
679
|
+
gsl_wavelet2d_transform_matrix_forward,
|
|
680
|
+
RB_GSL_DWT_COPY);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
static VALUE rb_gsl_wavelet2d_transform_matrix_forward2(int argc, VALUE *argv, VALUE obj)
|
|
684
|
+
{
|
|
685
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
686
|
+
gsl_wavelet2d_transform_matrix_forward,
|
|
687
|
+
RB_GSL_DWT_INPLACE);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
static VALUE rb_gsl_wavelet2d_transform_matrix_inverse(int argc, VALUE *argv, VALUE obj)
|
|
691
|
+
{
|
|
692
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
693
|
+
gsl_wavelet2d_transform_matrix_inverse,
|
|
694
|
+
RB_GSL_DWT_COPY);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
static VALUE rb_gsl_wavelet2d_transform_matrix_inverse2(int argc, VALUE *argv, VALUE obj)
|
|
698
|
+
{
|
|
699
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
700
|
+
gsl_wavelet2d_transform_matrix_inverse,
|
|
701
|
+
RB_GSL_DWT_INPLACE);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/** nstransform **/
|
|
705
|
+
static VALUE rb_gsl_wavelet2d_nstransform_matrix(int argc, VALUE *argv, VALUE obj)
|
|
706
|
+
{
|
|
707
|
+
return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_nstransform_matrix,
|
|
708
|
+
RB_GSL_DWT_COPY);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
static VALUE rb_gsl_wavelet2d_nstransform_matrix2(int argc, VALUE *argv, VALUE obj)
|
|
712
|
+
{
|
|
713
|
+
return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_nstransform_matrix,
|
|
714
|
+
RB_GSL_DWT_INPLACE);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
static VALUE rb_gsl_wavelet2d_nstransform_matrix_forward(int argc, VALUE *argv, VALUE obj)
|
|
718
|
+
{
|
|
719
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
720
|
+
gsl_wavelet2d_nstransform_matrix_forward,
|
|
721
|
+
RB_GSL_DWT_COPY);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
static VALUE rb_gsl_wavelet2d_nstransform_matrix_forward2(int argc, VALUE *argv, VALUE obj)
|
|
725
|
+
{
|
|
726
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
727
|
+
gsl_wavelet2d_nstransform_matrix_forward,
|
|
728
|
+
RB_GSL_DWT_INPLACE);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
static VALUE rb_gsl_wavelet2d_nstransform_matrix_inverse(int argc, VALUE *argv, VALUE obj)
|
|
732
|
+
{
|
|
733
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
734
|
+
gsl_wavelet2d_nstransform_matrix_inverse,
|
|
735
|
+
RB_GSL_DWT_COPY);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
static VALUE rb_gsl_wavelet2d_nstransform_matrix_inverse2(int argc, VALUE *argv, VALUE obj)
|
|
739
|
+
{
|
|
740
|
+
return rb_gsl_wavelet2d_trans(argc, argv, obj,
|
|
741
|
+
gsl_wavelet2d_nstransform_matrix_inverse,
|
|
742
|
+
RB_GSL_DWT_INPLACE);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
#endif
|
|
746
|
+
|
|
747
|
+
void Init_wavelet(VALUE module)
|
|
748
|
+
{
|
|
749
|
+
VALUE cgsl_wavelet2d;
|
|
750
|
+
|
|
751
|
+
cgsl_wavelet = rb_define_class_under(module, "Wavelet", cGSL_Object);
|
|
752
|
+
cgsl_wavelet2d = rb_define_class_under(module, "Wavelet2d", cgsl_wavelet);
|
|
753
|
+
|
|
754
|
+
rb_define_singleton_method(cgsl_wavelet, "alloc", rb_gsl_wavelet_new, 2);
|
|
755
|
+
|
|
756
|
+
#ifdef GSL_1_6_LATER
|
|
757
|
+
rb_gsl_wavelet_define_const(cgsl_wavelet);
|
|
758
|
+
rb_define_method(cgsl_wavelet, "name", rb_gsl_wavelet_name, 0);
|
|
759
|
+
|
|
760
|
+
cgsl_wavelet_workspace = rb_define_class_under(cgsl_wavelet, "Workspace", cGSL_Object);
|
|
761
|
+
rb_define_singleton_method(cgsl_wavelet_workspace, "alloc",
|
|
762
|
+
rb_gsl_wavelet_workspace_new, 1);
|
|
763
|
+
|
|
764
|
+
/*****/
|
|
765
|
+
|
|
766
|
+
rb_define_singleton_method(cgsl_wavelet, "transform",
|
|
767
|
+
rb_gsl_wavelet_transform, -1);
|
|
768
|
+
rb_define_method(cgsl_wavelet, "transform", rb_gsl_wavelet_transform, -1);
|
|
769
|
+
rb_define_method(cgsl_vector, "wavelet_transform", rb_gsl_wavelet_transform, -1);
|
|
770
|
+
rb_define_singleton_method(cgsl_wavelet, "transform!",
|
|
771
|
+
rb_gsl_wavelet_transform2, -1);
|
|
772
|
+
rb_define_method(cgsl_wavelet, "transform!", rb_gsl_wavelet_transform2, -1);
|
|
773
|
+
rb_define_method(cgsl_vector, "wavelet_transform!", rb_gsl_wavelet_transform2, -1);
|
|
774
|
+
|
|
775
|
+
/**/
|
|
776
|
+
|
|
777
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_forward",
|
|
778
|
+
rb_gsl_wavelet_transform_forward, -1);
|
|
779
|
+
rb_define_method(cgsl_wavelet, "transform_forward",
|
|
780
|
+
rb_gsl_wavelet_transform_forward, -1);
|
|
781
|
+
rb_define_alias(cgsl_wavelet, "forward", "transform_forward");
|
|
782
|
+
rb_define_method(cgsl_vector, "wavelet_transform_forward",
|
|
783
|
+
rb_gsl_wavelet_transform_forward, -1);
|
|
784
|
+
|
|
785
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_inverse",
|
|
786
|
+
rb_gsl_wavelet_transform_inverse, -1);
|
|
787
|
+
rb_define_method(cgsl_wavelet, "transform_inverse",
|
|
788
|
+
rb_gsl_wavelet_transform_inverse, -1);
|
|
789
|
+
rb_define_alias(cgsl_wavelet, "inverse", "transform_inverse");
|
|
790
|
+
rb_define_method(cgsl_vector, "wavelet_transform_inverse",
|
|
791
|
+
rb_gsl_wavelet_transform_inverse, -1);
|
|
792
|
+
|
|
793
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_forward!",
|
|
794
|
+
rb_gsl_wavelet_transform_forward2, -1);
|
|
795
|
+
rb_define_method(cgsl_wavelet, "transform_forward!",
|
|
796
|
+
rb_gsl_wavelet_transform_forward2, -1);
|
|
797
|
+
rb_define_alias(cgsl_wavelet, "forward!", "transform_forward!");
|
|
798
|
+
rb_define_method(cgsl_vector, "wavelet_transform_forward!",
|
|
799
|
+
rb_gsl_wavelet_transform_forward2, -1);
|
|
800
|
+
|
|
801
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_inverse!",
|
|
802
|
+
rb_gsl_wavelet_transform_inverse2, -1);
|
|
803
|
+
rb_define_method(cgsl_wavelet, "transform_inverse!",
|
|
804
|
+
rb_gsl_wavelet_transform_inverse2, -1);
|
|
805
|
+
rb_define_alias(cgsl_wavelet, "inverse!", "transform_inverse!");
|
|
806
|
+
rb_define_method(cgsl_vector, "wavelet_transform_inverse!",
|
|
807
|
+
rb_gsl_wavelet_transform_inverse2, -1);
|
|
808
|
+
/***** 2d *****/
|
|
809
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_matrix",
|
|
810
|
+
rb_gsl_wavelet2d_transform_matrix, -1);
|
|
811
|
+
rb_define_singleton_method(cgsl_wavelet2d, "transform",
|
|
812
|
+
rb_gsl_wavelet2d_transform_matrix, -1);
|
|
813
|
+
rb_define_method(cgsl_wavelet, "transform_matrix",
|
|
814
|
+
rb_gsl_wavelet2d_transform_matrix, -1);
|
|
815
|
+
rb_define_method(cgsl_wavelet2d, "transform",
|
|
816
|
+
rb_gsl_wavelet2d_transform_matrix, -1);
|
|
817
|
+
rb_define_method(cgsl_matrix, "wavelet_transform",
|
|
818
|
+
rb_gsl_wavelet2d_transform_matrix, -1);
|
|
819
|
+
|
|
820
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_matrix!",
|
|
821
|
+
rb_gsl_wavelet2d_transform_matrix2, -1);
|
|
822
|
+
rb_define_singleton_method(cgsl_wavelet2d, "transform!",
|
|
823
|
+
rb_gsl_wavelet2d_transform_matrix2, -1);
|
|
824
|
+
rb_define_method(cgsl_wavelet, "transform_matrix!",
|
|
825
|
+
rb_gsl_wavelet2d_transform_matrix2, -1);
|
|
826
|
+
rb_define_method(cgsl_wavelet2d, "transform!",
|
|
827
|
+
rb_gsl_wavelet2d_transform_matrix2, -1);
|
|
828
|
+
rb_define_method(cgsl_matrix, "wavelet_transform!",
|
|
829
|
+
rb_gsl_wavelet2d_transform_matrix2, -1);
|
|
830
|
+
/**/
|
|
831
|
+
|
|
832
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward",
|
|
833
|
+
rb_gsl_wavelet2d_transform_matrix_forward, -1);
|
|
834
|
+
rb_define_singleton_method(cgsl_wavelet2d, "transform_forward",
|
|
835
|
+
rb_gsl_wavelet2d_transform_matrix_forward, -1);
|
|
836
|
+
rb_define_method(cgsl_wavelet, "transform_matrix_forward",
|
|
837
|
+
rb_gsl_wavelet2d_transform_matrix_forward, -1);
|
|
838
|
+
rb_define_method(cgsl_wavelet2d, "transform_forward",
|
|
839
|
+
rb_gsl_wavelet2d_transform_matrix_forward, -1);
|
|
840
|
+
rb_define_method(cgsl_matrix, "wavelet_transform_forward",
|
|
841
|
+
rb_gsl_wavelet2d_transform_matrix_forward, -1);
|
|
842
|
+
|
|
843
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward!",
|
|
844
|
+
rb_gsl_wavelet2d_transform_matrix_forward2, -1);
|
|
845
|
+
rb_define_singleton_method(cgsl_wavelet2d, "transform_forward!",
|
|
846
|
+
rb_gsl_wavelet2d_transform_matrix_forward2, -1);
|
|
847
|
+
rb_define_method(cgsl_wavelet, "transform_matrix_forward!",
|
|
848
|
+
rb_gsl_wavelet2d_transform_matrix_forward2, -1);
|
|
849
|
+
rb_define_method(cgsl_wavelet2d, "transform_forward!",
|
|
850
|
+
rb_gsl_wavelet2d_transform_matrix_forward2, -1);
|
|
851
|
+
rb_define_method(cgsl_matrix, "wavelet_transform_forward!",
|
|
852
|
+
rb_gsl_wavelet2d_transform_matrix_forward2, -1);
|
|
853
|
+
|
|
854
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse",
|
|
855
|
+
rb_gsl_wavelet2d_transform_matrix_inverse, -1);
|
|
856
|
+
rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse",
|
|
857
|
+
rb_gsl_wavelet2d_transform_matrix_inverse, -1);
|
|
858
|
+
rb_define_method(cgsl_wavelet, "transform_matrix_inverse",
|
|
859
|
+
rb_gsl_wavelet2d_transform_matrix_inverse, -1);
|
|
860
|
+
rb_define_method(cgsl_wavelet2d, "transform_inverse",
|
|
861
|
+
rb_gsl_wavelet2d_transform_matrix_inverse, -1);
|
|
862
|
+
rb_define_method(cgsl_matrix, "wavelet_transform_inverse",
|
|
863
|
+
rb_gsl_wavelet2d_transform_matrix_inverse, -1);
|
|
864
|
+
|
|
865
|
+
rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse!",
|
|
866
|
+
rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
|
|
867
|
+
rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse!",
|
|
868
|
+
rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
|
|
869
|
+
rb_define_method(cgsl_wavelet, "transform_matrix_inverse!",
|
|
870
|
+
rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
|
|
871
|
+
rb_define_method(cgsl_wavelet2d, "transform_inverse!",
|
|
872
|
+
rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
|
|
873
|
+
rb_define_method(cgsl_matrix, "wavelet_transform_inverse!",
|
|
874
|
+
rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
|
|
875
|
+
|
|
876
|
+
/** nstransform **/
|
|
877
|
+
rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix",
|
|
878
|
+
rb_gsl_wavelet2d_nstransform_matrix, -1);
|
|
879
|
+
rb_define_singleton_method(cgsl_wavelet2d, "nstransform",
|
|
880
|
+
rb_gsl_wavelet2d_nstransform_matrix, -1);
|
|
881
|
+
rb_define_method(cgsl_wavelet, "nstransform_matrix",
|
|
882
|
+
rb_gsl_wavelet2d_nstransform_matrix, -1);
|
|
883
|
+
rb_define_method(cgsl_wavelet2d, "nstransform",
|
|
884
|
+
rb_gsl_wavelet2d_nstransform_matrix, -1);
|
|
885
|
+
|
|
886
|
+
rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix!",
|
|
887
|
+
rb_gsl_wavelet2d_nstransform_matrix2, -1);
|
|
888
|
+
rb_define_singleton_method(cgsl_wavelet2d, "nstransform!",
|
|
889
|
+
rb_gsl_wavelet2d_nstransform_matrix2, -1);
|
|
890
|
+
rb_define_method(cgsl_wavelet, "nstransform_matrix!",
|
|
891
|
+
rb_gsl_wavelet2d_nstransform_matrix2, -1);
|
|
892
|
+
rb_define_method(cgsl_wavelet2d, "nstransform!",
|
|
893
|
+
rb_gsl_wavelet2d_nstransform_matrix2, -1);
|
|
894
|
+
/**/
|
|
895
|
+
|
|
896
|
+
rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward",
|
|
897
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
|
|
898
|
+
rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward",
|
|
899
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
|
|
900
|
+
rb_define_method(cgsl_wavelet, "nstransform_matrix_forward",
|
|
901
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
|
|
902
|
+
rb_define_method(cgsl_wavelet2d, "nstransform_forward",
|
|
903
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
|
|
904
|
+
|
|
905
|
+
rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward!",
|
|
906
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
|
|
907
|
+
rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward!",
|
|
908
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
|
|
909
|
+
rb_define_method(cgsl_wavelet, "nstransform_matrix_forward!",
|
|
910
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
|
|
911
|
+
rb_define_method(cgsl_wavelet2d, "nstransform_forward!",
|
|
912
|
+
rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
|
|
913
|
+
|
|
914
|
+
rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse",
|
|
915
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
|
|
916
|
+
rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse",
|
|
917
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
|
|
918
|
+
rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse",
|
|
919
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
|
|
920
|
+
rb_define_method(cgsl_wavelet2d, "nstransform_inverse",
|
|
921
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
|
|
922
|
+
|
|
923
|
+
rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse!",
|
|
924
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
|
|
925
|
+
rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse!",
|
|
926
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
|
|
927
|
+
rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse!",
|
|
928
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
|
|
929
|
+
rb_define_method(cgsl_wavelet2d, "nstransform_inverse!",
|
|
930
|
+
rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
|
|
931
|
+
|
|
932
|
+
#endif
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
#undef CHECK_WAVELET
|
|
936
|
+
#undef CHECK_WORKSPACE
|
|
937
|
+
|