gsl 1.16.0.6 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -13
- data/ChangeLog +6 -0
- data/Gemfile +1 -0
- data/README.md +77 -1
- data/Rakefile +7 -1
- data/examples/linalg/QR_solve_narray.rb +2 -1
- data/examples/linalg/SV_narray.rb +10 -0
- data/examples/linalg/chol_narray.rb +3 -0
- data/examples/wavelet/wavelet1.rb +4 -2
- data/ext/gsl_native/array.c +10 -0
- data/ext/gsl_native/bspline.c +15 -2
- data/ext/gsl_native/cheb.c +76 -10
- data/ext/gsl_native/common.c +33 -0
- data/ext/gsl_native/dht.c +26 -0
- data/ext/gsl_native/eigen.c +129 -0
- data/ext/gsl_native/extconf.rb +60 -6
- data/ext/gsl_native/fft.c +42 -0
- data/ext/gsl_native/function.c +18 -0
- data/ext/gsl_native/gsl.c +5 -0
- data/ext/gsl_native/gsl_nmatrix.c +204 -0
- data/ext/gsl_native/histogram.c +42 -0
- data/ext/gsl_native/include/rb_gsl.h +4 -0
- data/ext/gsl_native/include/rb_gsl_array.h +4 -0
- data/ext/gsl_native/include/rb_gsl_common.h +5 -0
- data/ext/gsl_native/include/rb_gsl_interp.h +4 -0
- data/ext/gsl_native/include/rb_gsl_with_nmatrix.h +28 -0
- data/ext/gsl_native/interp.c +14 -0
- data/ext/gsl_native/linalg.c +414 -22
- data/ext/gsl_native/math.c +64 -0
- data/ext/gsl_native/multifit.c +61 -0
- data/ext/gsl_native/randist.c +42 -0
- data/ext/gsl_native/sf.c +6 -0
- data/ext/gsl_native/sf_ellint.c +4 -4
- data/ext/gsl_native/sf_mathieu.c +48 -0
- data/ext/gsl_native/spline.c +30 -0
- data/ext/gsl_native/tamu_anova.c +1 -1
- data/gsl.gemspec +8 -1
- data/lib/gsl.rb +5 -0
- data/lib/gsl/version.rb +1 -1
- data/rdoc/nmatrix.rdoc +129 -0
- data/rdoc/ref.rdoc +1 -0
- data/test.sh +21 -0
- data/test/gsl/bspline_test.rb +15 -14
- data/test/gsl/combination_test.rb +17 -6
- data/test/gsl/dht_test.rb +42 -33
- data/test/gsl/nmatrix_tests/nmatrix_cheb_test.rb +34 -0
- data/test/gsl/nmatrix_tests/nmatrix_eigen_test.rb +28 -0
- data/test/gsl/nmatrix_tests/nmatrix_gsl_test.rb +65 -0
- data/test/gsl/nmatrix_tests/nmatrix_interp_test.rb +45 -0
- data/test/gsl/nmatrix_tests/nmatrix_linalg_test.rb +100 -0
- data/test/gsl/nmatrix_tests/nmatrix_stats_test.rb +88 -0
- data/test/gsl/nmatrix_tests/nmatrix_wavelet_test.rb +5 -0
- data/test/gsl/randist_test.rb +43 -23
- data/test/test_helper.rb +30 -2
- metadata +191 -51
data/ext/gsl_native/histogram.c
CHANGED
@@ -1169,6 +1169,9 @@ static VALUE rb_gsl_histogram_fit_gaussian(int argc, VALUE *argv, VALUE obj)
|
|
1169
1169
|
size_t n, dof; /* # of data points */
|
1170
1170
|
size_t p = 3; /* # of fitting parameters */
|
1171
1171
|
gsl_multifit_function_fdf f;
|
1172
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1173
|
+
gsl_matrix *J = NULL;
|
1174
|
+
#endif
|
1172
1175
|
gsl_matrix *covar = NULL;
|
1173
1176
|
gsl_vector *x = NULL;
|
1174
1177
|
double sigma, mean, height, errs, errm, errh, chi2;
|
@@ -1197,6 +1200,9 @@ static VALUE rb_gsl_histogram_fit_gaussian(int argc, VALUE *argv, VALUE obj)
|
|
1197
1200
|
hh.binend = binend;
|
1198
1201
|
n = binend - binstart + 1;
|
1199
1202
|
|
1203
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1204
|
+
J = gsl_matrix_alloc(n, p);
|
1205
|
+
#endif
|
1200
1206
|
covar = gsl_matrix_alloc(p, p);
|
1201
1207
|
|
1202
1208
|
f.f = Gaussian_f;
|
@@ -1219,7 +1225,12 @@ static VALUE rb_gsl_histogram_fit_gaussian(int argc, VALUE *argv, VALUE obj)
|
|
1219
1225
|
sigma = sqrt(gsl_vector_get(s->x, 0));
|
1220
1226
|
mean = gsl_vector_get(s->x, 1);
|
1221
1227
|
height = gsl_vector_get(s->x, 2)*sigma*sqrt(2*M_PI);
|
1228
|
+
#ifdef GSL_MULTIFIT_FDFSOLVER_J
|
1222
1229
|
gsl_multifit_covar(s->J, 0.0, covar);
|
1230
|
+
#else
|
1231
|
+
gsl_multifit_fdfsolver_jac(s, J);
|
1232
|
+
gsl_multifit_covar(J, 0.0, covar);
|
1233
|
+
#endif
|
1223
1234
|
chi2 = gsl_pow_2(gsl_blas_dnrm2(s->f)); /* not reduced chi-square */
|
1224
1235
|
dof = n - p;
|
1225
1236
|
errs = sqrt(chi2/dof*gsl_matrix_get(covar, 0, 0))/sigma/2;
|
@@ -1228,6 +1239,9 @@ static VALUE rb_gsl_histogram_fit_gaussian(int argc, VALUE *argv, VALUE obj)
|
|
1228
1239
|
|
1229
1240
|
gsl_multifit_fdfsolver_free(s);
|
1230
1241
|
gsl_vector_free(x);
|
1242
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1243
|
+
gsl_matrix_free(J);
|
1244
|
+
#endif
|
1231
1245
|
gsl_matrix_free(covar);
|
1232
1246
|
return rb_ary_new3(8, rb_float_new(sigma), rb_float_new(mean),
|
1233
1247
|
rb_float_new(height), rb_float_new(errs),
|
@@ -1305,6 +1319,9 @@ static VALUE rb_gsl_histogram_fit_rayleigh(int argc, VALUE *argv, VALUE obj)
|
|
1305
1319
|
size_t n, dof; /* # of data points */
|
1306
1320
|
size_t p = 2; /* # of fitting parameters */
|
1307
1321
|
gsl_multifit_function_fdf f;
|
1322
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1323
|
+
gsl_matrix *J = NULL;
|
1324
|
+
#endif
|
1308
1325
|
gsl_matrix *covar = NULL;
|
1309
1326
|
gsl_vector *x = NULL;
|
1310
1327
|
double sigma, height, errs, errh, chi2;
|
@@ -1332,6 +1349,9 @@ static VALUE rb_gsl_histogram_fit_rayleigh(int argc, VALUE *argv, VALUE obj)
|
|
1332
1349
|
hh.binend = binend;
|
1333
1350
|
n = binend - binstart + 1;
|
1334
1351
|
|
1352
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1353
|
+
J = gsl_matrix_alloc(n, p);
|
1354
|
+
#endif
|
1335
1355
|
covar = gsl_matrix_alloc(p, p);
|
1336
1356
|
|
1337
1357
|
f.f = Rayleigh_f;
|
@@ -1353,7 +1373,12 @@ static VALUE rb_gsl_histogram_fit_rayleigh(int argc, VALUE *argv, VALUE obj)
|
|
1353
1373
|
} while (status == GSL_CONTINUE);
|
1354
1374
|
sigma = sqrt(gsl_vector_get(s->x, 0));
|
1355
1375
|
height = gsl_vector_get(s->x, 1)*sigma*sigma;
|
1376
|
+
#ifdef GSL_MULTIFIT_FDFSOLVER_J
|
1356
1377
|
gsl_multifit_covar(s->J, 0.0, covar);
|
1378
|
+
#else
|
1379
|
+
gsl_multifit_fdfsolver_jac(s, J);
|
1380
|
+
gsl_multifit_covar(J, 0.0, covar);
|
1381
|
+
#endif
|
1357
1382
|
chi2 = gsl_pow_2(gsl_blas_dnrm2(s->f)); /* not reduced chi-square */
|
1358
1383
|
dof = n - p;
|
1359
1384
|
errs = sqrt(chi2/dof*gsl_matrix_get(covar, 0, 0))/sigma/2;
|
@@ -1361,6 +1386,9 @@ static VALUE rb_gsl_histogram_fit_rayleigh(int argc, VALUE *argv, VALUE obj)
|
|
1361
1386
|
|
1362
1387
|
gsl_multifit_fdfsolver_free(s);
|
1363
1388
|
gsl_vector_free(x);
|
1389
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1390
|
+
gsl_matrix_free(J);
|
1391
|
+
#endif
|
1364
1392
|
gsl_matrix_free(covar);
|
1365
1393
|
return rb_ary_new3(6, rb_float_new(sigma),
|
1366
1394
|
rb_float_new(height), rb_float_new(errs),
|
@@ -1441,6 +1469,9 @@ static VALUE rb_gsl_histogram_fit_xexponential(int argc, VALUE *argv, VALUE obj)
|
|
1441
1469
|
size_t n, dof; /* # of data points */
|
1442
1470
|
size_t p = 2; /* # of fitting parameters */
|
1443
1471
|
gsl_multifit_function_fdf f;
|
1472
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1473
|
+
gsl_matrix *J = NULL;
|
1474
|
+
#endif
|
1444
1475
|
gsl_matrix *covar = NULL;
|
1445
1476
|
gsl_vector *x = NULL;
|
1446
1477
|
double b, height, errs, errh, chi2;
|
@@ -1468,6 +1499,9 @@ static VALUE rb_gsl_histogram_fit_xexponential(int argc, VALUE *argv, VALUE obj)
|
|
1468
1499
|
hh.binend = binend;
|
1469
1500
|
n = binend - binstart + 1;
|
1470
1501
|
|
1502
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1503
|
+
J = gsl_matrix_alloc(n, p);
|
1504
|
+
#endif
|
1471
1505
|
covar = gsl_matrix_alloc(p, p);
|
1472
1506
|
|
1473
1507
|
f.f = xExponential_f;
|
@@ -1489,7 +1523,12 @@ static VALUE rb_gsl_histogram_fit_xexponential(int argc, VALUE *argv, VALUE obj)
|
|
1489
1523
|
} while (status == GSL_CONTINUE);
|
1490
1524
|
b = gsl_vector_get(s->x, 0);
|
1491
1525
|
height = gsl_vector_get(s->x, 1);
|
1526
|
+
#ifdef GSL_MULTIFIT_FDFSOLVER_J
|
1492
1527
|
gsl_multifit_covar(s->J, 0.0, covar);
|
1528
|
+
#else
|
1529
|
+
gsl_multifit_fdfsolver_jac(s, J);
|
1530
|
+
gsl_multifit_covar(J, 0.0, covar);
|
1531
|
+
#endif
|
1493
1532
|
chi2 = gsl_pow_2(gsl_blas_dnrm2(s->f)); /* not reduced chi-square */
|
1494
1533
|
dof = n - p;
|
1495
1534
|
errs = sqrt(chi2/dof*gsl_matrix_get(covar, 0, 0));
|
@@ -1497,6 +1536,9 @@ static VALUE rb_gsl_histogram_fit_xexponential(int argc, VALUE *argv, VALUE obj)
|
|
1497
1536
|
|
1498
1537
|
gsl_multifit_fdfsolver_free(s);
|
1499
1538
|
gsl_vector_free(x);
|
1539
|
+
#ifndef GSL_MULTIFIT_FDFSOLVER_J
|
1540
|
+
gsl_matrix_free(J);
|
1541
|
+
#endif
|
1500
1542
|
gsl_matrix_free(covar);
|
1501
1543
|
return rb_ary_new3(6, rb_float_new(b),
|
1502
1544
|
rb_float_new(height), rb_float_new(errs),
|
@@ -24,6 +24,7 @@
|
|
24
24
|
#include <gsl/gsl_permutation.h>
|
25
25
|
#include <gsl/gsl_ieee_utils.h>
|
26
26
|
#include "rb_gsl_with_narray.h"
|
27
|
+
#include "rb_gsl_with_nmatrix.h"
|
27
28
|
|
28
29
|
EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
|
29
30
|
|
@@ -344,5 +345,9 @@ VALUE rb_gsl_ary_eval1(VALUE ary, double (*f)(double));
|
|
344
345
|
VALUE rb_gsl_nary_eval1(VALUE ary, double (*f)(double));
|
345
346
|
#endif
|
346
347
|
|
348
|
+
#ifdef HAVE_NMATRIX_H
|
349
|
+
VALUE rb_gsl_nmatrix_eval1(VALUE ary, double (*f)(double));
|
350
|
+
#endif
|
351
|
+
|
347
352
|
EXTERN VALUE cGSL_Object;
|
348
353
|
#endif
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#ifndef RB_GSL_WITH_NMATRIX_H
|
2
|
+
#define RB_GSL_WITH_NMATRIX_H
|
3
|
+
|
4
|
+
#include <gsl/gsl_vector.h>
|
5
|
+
|
6
|
+
#ifdef HAVE_NMATRIX_H
|
7
|
+
|
8
|
+
#include "nmatrix.h"
|
9
|
+
#include "include/rb_gsl_array.h"
|
10
|
+
extern VALUE cNMatrix;
|
11
|
+
|
12
|
+
// nmatrix external API
|
13
|
+
extern VALUE rb_nmatrix_dense_create(nm_dtype_t dtype, size_t* shape, size_t rank, void* elements, size_t length);
|
14
|
+
extern VALUE rb_nvector_dense_create(nm_dtype_t dtype, void* elements, size_t length);
|
15
|
+
|
16
|
+
// functions to convert NMatrix to GSL::Vector
|
17
|
+
gsl_vector* rb_gsl_nmatrix_to_gv(VALUE nm);
|
18
|
+
gsl_vector_int* rb_gsl_nmatrix_to_gv_int(VALUE nm);
|
19
|
+
gsl_vector_complex* rb_gsl_nmatrix_to_gv_complex(VALUE nm);
|
20
|
+
|
21
|
+
// functions to convert NMatrix to GSL::Matrix
|
22
|
+
gsl_matrix* rb_gsl_nmatrix_to_gm(VALUE nm);
|
23
|
+
gsl_matrix_int* rb_gsl_nmatrix_to_gm_int(VALUE nm);
|
24
|
+
gsl_matrix_complex* rb_gsl_nmatrix_to_gm_complex(VALUE nm);
|
25
|
+
|
26
|
+
|
27
|
+
#endif // HAVE_NMATRIX_H
|
28
|
+
#endif // RB_GSL_WITH_NMATRIX_H
|
data/ext/gsl_native/interp.c
CHANGED
@@ -221,6 +221,20 @@ static VALUE rb_gsl_interp_evaluate(VALUE obj, VALUE xxa, VALUE yya, VALUE xx,
|
|
221
221
|
ptr[i] = (*eval)(rgi->p, ptrx, ptry, ptrz[i], rgi->a);
|
222
222
|
return ary;
|
223
223
|
}
|
224
|
+
#endif
|
225
|
+
#ifdef HAVE_NMATRIX_H
|
226
|
+
if (NM_IsNMatrix(xx)) {
|
227
|
+
NM_DENSE_STORAGE *nm;
|
228
|
+
double *ptrz = NULL, *ptr = NULL;
|
229
|
+
size_t n = NM_DENSE_COUNT(xx);
|
230
|
+
nm = NM_STORAGE_DENSE(xx);
|
231
|
+
ptrz = (double*) nm->elements;
|
232
|
+
ary = rb_nmatrix_dense_create(FLOAT64, nm->shape, nm->dim, nm->elements, n);
|
233
|
+
ptr = (double*)NM_DENSE_ELEMENTS(ary);
|
234
|
+
for (i = 0; (int) i < n; i++)
|
235
|
+
ptr[i] = (*eval)(rgi->p, ptrx, ptry, ptrz[i], rgi->a);
|
236
|
+
return ary;
|
237
|
+
}
|
224
238
|
#endif
|
225
239
|
if (VECTOR_P(xx)) {
|
226
240
|
Data_Get_Struct(xx, gsl_vector, v);
|
data/ext/gsl_native/linalg.c
CHANGED
@@ -74,6 +74,47 @@ static VALUE rb_gsl_linalg_LU_decomp_narray(int argc, VALUE *argv, VALUE obj,
|
|
74
74
|
}
|
75
75
|
#endif
|
76
76
|
|
77
|
+
#ifdef HAVE_NMATRIX_H
|
78
|
+
static VALUE rb_gsl_linalg_LU_decomp_nmatrix(int argc, VALUE *argv, VALUE obj,
|
79
|
+
int flag)
|
80
|
+
{
|
81
|
+
NM_DENSE_STORAGE *input_nmatrix, *temp_nmatrix;
|
82
|
+
VALUE m;
|
83
|
+
gsl_matrix_view mv;
|
84
|
+
gsl_permutation *p;
|
85
|
+
int signum;
|
86
|
+
|
87
|
+
if (argc != 1)
|
88
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
|
89
|
+
|
90
|
+
input_nmatrix = NM_STORAGE_DENSE(argv[0]);
|
91
|
+
if (input_nmatrix->shape[0] != input_nmatrix->shape[1])
|
92
|
+
rb_raise(rb_eRuntimeError, "square matrix required");
|
93
|
+
|
94
|
+
if (flag == LINALG_DECOMP) {
|
95
|
+
m = rb_nmatrix_dense_create(FLOAT64, input_nmatrix->shape, 2,
|
96
|
+
input_nmatrix->elements, input_nmatrix->shape[0] * input_nmatrix->shape[1]);
|
97
|
+
temp_nmatrix = NM_STORAGE_DENSE(m);
|
98
|
+
mv = gsl_matrix_view_array((double*)temp_nmatrix->elements,
|
99
|
+
temp_nmatrix->shape[0], temp_nmatrix->shape[1]);
|
100
|
+
} else {
|
101
|
+
mv = gsl_matrix_view_array((double*)input_nmatrix->elements,
|
102
|
+
input_nmatrix->shape[0], input_nmatrix->shape[1]);
|
103
|
+
}
|
104
|
+
p = gsl_permutation_alloc(mv.matrix.size1);
|
105
|
+
gsl_linalg_LU_decomp(&mv.matrix, p, &signum);
|
106
|
+
if (flag == LINALG_DECOMP) {
|
107
|
+
return rb_ary_new3(3, m,
|
108
|
+
Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
|
109
|
+
INT2FIX(signum));
|
110
|
+
} else {
|
111
|
+
return rb_ary_new3(3, argv[0],
|
112
|
+
Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
|
113
|
+
INT2FIX(signum));
|
114
|
+
}
|
115
|
+
}
|
116
|
+
#endif
|
117
|
+
|
77
118
|
static VALUE rb_gsl_linalg_LU_decomposition(int argc, VALUE *argv, VALUE obj, int flag)
|
78
119
|
{
|
79
120
|
gsl_matrix *mtmp = NULL, *m = NULL;
|
@@ -84,8 +125,15 @@ static VALUE rb_gsl_linalg_LU_decomposition(int argc, VALUE *argv, VALUE obj, in
|
|
84
125
|
switch (TYPE(obj)) {
|
85
126
|
case T_MODULE: case T_CLASS: case T_OBJECT:
|
86
127
|
#ifdef HAVE_NARRAY_H
|
87
|
-
if (NA_IsNArray(argv[0]))
|
128
|
+
if (NA_IsNArray(argv[0])) {
|
88
129
|
return rb_gsl_linalg_LU_decomp_narray(argc, argv, obj, flag);
|
130
|
+
}
|
131
|
+
#endif
|
132
|
+
|
133
|
+
#ifdef HAVE_NMATRIX_H
|
134
|
+
if (NM_IsNMatrix(argv[0])) {
|
135
|
+
return rb_gsl_linalg_LU_decomp_nmatrix(argc, argv, obj, flag);
|
136
|
+
}
|
89
137
|
#endif
|
90
138
|
if (MATRIX_COMPLEX_P(argv[0]))
|
91
139
|
return rb_gsl_linalg_complex_LU_decomp2(argc, argv, obj);
|
@@ -239,6 +287,42 @@ static VALUE rb_gsl_linalg_LU_solve_narray(int argc, VALUE *argv, VALUE obj)
|
|
239
287
|
}
|
240
288
|
#endif
|
241
289
|
|
290
|
+
#ifdef HAVE_NMATRIX_H
|
291
|
+
static VALUE rb_gsl_linalg_LU_solve_nmatrix(int argc, VALUE *argv, VALUE obj)
|
292
|
+
{
|
293
|
+
VALUE ret;
|
294
|
+
NM_DENSE_STORAGE *input_nmatrix, *b;
|
295
|
+
gsl_permutation *p;
|
296
|
+
gsl_matrix_view mv;
|
297
|
+
gsl_vector_view bv, xv;
|
298
|
+
double *x;
|
299
|
+
unsigned int shape[1];
|
300
|
+
|
301
|
+
if (argc < 3) {
|
302
|
+
rb_raise(rb_eArgError,
|
303
|
+
"wrong number of arguments %d(NMatrix, GSL::Permutation and NMatrix expected)",
|
304
|
+
argc);
|
305
|
+
}
|
306
|
+
input_nmatrix = NM_STORAGE_DENSE(argv[0]);
|
307
|
+
mv = gsl_matrix_view_array((double*) input_nmatrix->elements,
|
308
|
+
input_nmatrix->shape[0], input_nmatrix->shape[1]);
|
309
|
+
CHECK_PERMUTATION(argv[1]);
|
310
|
+
Data_Get_Struct(argv[1], gsl_permutation, p);
|
311
|
+
b = NM_STORAGE_DENSE(argv[2]);
|
312
|
+
bv = gsl_vector_view_array((double*) b->elements, b->shape[0]);
|
313
|
+
if (argc == 3) {
|
314
|
+
shape[0] = b->shape[0];
|
315
|
+
ret = rb_nmatrix_dense_create(FLOAT64, shape, 1, b->elements, shape[0]);
|
316
|
+
} else {
|
317
|
+
ret = argv[3];
|
318
|
+
}
|
319
|
+
x = (double*)NM_DENSE_ELEMENTS(ret);
|
320
|
+
xv = gsl_vector_view_array(x, b->shape[0]);
|
321
|
+
gsl_linalg_LU_solve(&mv.matrix, p, &bv.vector, &xv.vector);
|
322
|
+
return ret;
|
323
|
+
}
|
324
|
+
#endif
|
325
|
+
|
242
326
|
VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
|
243
327
|
{
|
244
328
|
gsl_matrix *m = NULL;
|
@@ -255,6 +339,11 @@ VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
|
|
255
339
|
if (NA_IsNArray(argv[0]))
|
256
340
|
return rb_gsl_linalg_LU_solve_narray(argc, argv, obj);
|
257
341
|
#endif
|
342
|
+
|
343
|
+
#ifdef HAVE_NMATRIX_H
|
344
|
+
if (NM_IsNMatrix(argv[0]))
|
345
|
+
return rb_gsl_linalg_LU_solve_nmatrix(argc, argv, obj);
|
346
|
+
#endif
|
258
347
|
m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
|
259
348
|
itmp = 1;
|
260
349
|
break;
|
@@ -439,6 +528,33 @@ static VALUE rb_gsl_linalg_LU_lndet_narray(int argc, VALUE *argv, VALUE obj)
|
|
439
528
|
|
440
529
|
#endif
|
441
530
|
|
531
|
+
#ifdef HAVE_NMATRIX_H
|
532
|
+
static VALUE rb_gsl_linalg_LU_invert_nmatrix(int argc, VALUE *argv, VALUE obj)
|
533
|
+
{
|
534
|
+
NM_DENSE_STORAGE* lu_nmatrix;
|
535
|
+
VALUE inv;
|
536
|
+
gsl_permutation *p;
|
537
|
+
gsl_matrix_view mv1, mv2;
|
538
|
+
|
539
|
+
if (argc != 2) {
|
540
|
+
rb_raise(rb_eArgError, "Usage: LU.invert(lu, perm)");
|
541
|
+
}
|
542
|
+
|
543
|
+
CHECK_PERMUTATION(argv[1]);
|
544
|
+
lu_nmatrix = NM_STORAGE_DENSE(argv[0]);
|
545
|
+
inv = rb_nmatrix_dense_create(FLOAT64, lu_nmatrix->shape, 2,
|
546
|
+
lu_nmatrix->elements, NM_DENSE_COUNT(argv[0]));
|
547
|
+
mv1 = gsl_matrix_view_array((double*)lu_nmatrix->elements,
|
548
|
+
lu_nmatrix->shape[0], lu_nmatrix->shape[1]);
|
549
|
+
mv2 = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(inv),
|
550
|
+
lu_nmatrix->shape[0], lu_nmatrix->shape[1]);
|
551
|
+
|
552
|
+
Data_Get_Struct(argv[1], gsl_permutation, p);
|
553
|
+
gsl_linalg_LU_invert(&mv1.matrix, p, &mv2.matrix);
|
554
|
+
return inv;
|
555
|
+
}
|
556
|
+
#endif
|
557
|
+
|
442
558
|
static VALUE rb_gsl_linalg_LU_invert(int argc, VALUE *argv, VALUE obj)
|
443
559
|
{
|
444
560
|
gsl_matrix *m = NULL, *inverse = NULL;
|
@@ -451,6 +567,12 @@ static VALUE rb_gsl_linalg_LU_invert(int argc, VALUE *argv, VALUE obj)
|
|
451
567
|
if (NA_IsNArray(argv[0]))
|
452
568
|
return rb_gsl_linalg_LU_invert_narray(argc, argv, obj);
|
453
569
|
#endif
|
570
|
+
|
571
|
+
#ifdef HAVE_NMATRIX_H
|
572
|
+
if (NM_IsNMatrix(argv[0])) {
|
573
|
+
return rb_gsl_linalg_LU_invert_nmatrix(argc, argv, obj);
|
574
|
+
}
|
575
|
+
#endif
|
454
576
|
m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
|
455
577
|
itmp = 1;
|
456
578
|
break;
|
@@ -484,6 +606,31 @@ static VALUE rb_gsl_linalg_LU_invert(int argc, VALUE *argv, VALUE obj)
|
|
484
606
|
if (argc-1 == itmp) return argv[itmp];
|
485
607
|
else return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, inverse);
|
486
608
|
}
|
609
|
+
|
610
|
+
#ifdef HAVE_NMATRIX_H
|
611
|
+
static VALUE rb_gsl_linalg_LU_det_nmatrix(int argc, VALUE *argv, VALUE obj)
|
612
|
+
{
|
613
|
+
NM_DENSE_STORAGE *input_nmatrix;
|
614
|
+
gsl_matrix_view mv;
|
615
|
+
int signum = 1;
|
616
|
+
|
617
|
+
switch (argc) {
|
618
|
+
case 2:
|
619
|
+
signum = FIX2INT(argv[1]);
|
620
|
+
/* no break */
|
621
|
+
case 1:
|
622
|
+
input_nmatrix = NM_STORAGE_DENSE(argv[0]);
|
623
|
+
mv = gsl_matrix_view_array((double*)input_nmatrix->elements,
|
624
|
+
input_nmatrix->shape[0], input_nmatrix->shape[1]);
|
625
|
+
break;
|
626
|
+
default:
|
627
|
+
rb_raise(rb_eArgError, "Usage: LU.det(lu, perm)");
|
628
|
+
break;
|
629
|
+
}
|
630
|
+
return rb_float_new(gsl_linalg_LU_det(&mv.matrix, signum));
|
631
|
+
}
|
632
|
+
#endif
|
633
|
+
|
487
634
|
static VALUE rb_gsl_linalg_LU_det(int argc, VALUE *argv, VALUE obj)
|
488
635
|
{
|
489
636
|
gsl_matrix *m = NULL;
|
@@ -500,6 +647,11 @@ static VALUE rb_gsl_linalg_LU_det(int argc, VALUE *argv, VALUE obj)
|
|
500
647
|
return rb_gsl_linalg_LU_det_narray(argc, argv, obj);
|
501
648
|
#endif
|
502
649
|
|
650
|
+
#ifdef HAVE_NMATRIX_H
|
651
|
+
if (NM_IsNMatrix(argv[0])) {
|
652
|
+
return rb_gsl_linalg_LU_det_nmatrix(argc, argv, obj);
|
653
|
+
}
|
654
|
+
#endif
|
503
655
|
m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
|
504
656
|
itmp = 1;
|
505
657
|
break;
|
@@ -717,27 +869,6 @@ static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
|
|
717
869
|
}
|
718
870
|
|
719
871
|
#ifdef HAVE_NARRAY_H
|
720
|
-
static VALUE rb_gsl_linalg_QR_decomp_narray(int argc, VALUE *argv, VALUE obj)
|
721
|
-
{
|
722
|
-
struct NARRAY *na;
|
723
|
-
gsl_matrix_view mv;
|
724
|
-
gsl_vector_view vv;
|
725
|
-
int shapem[2], shapev[1];
|
726
|
-
VALUE qr, tau;
|
727
|
-
if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
|
728
|
-
GetNArray(argv[0], na);
|
729
|
-
shapem[0] = na->shape[1];
|
730
|
-
shapem[1] = na->shape[1];
|
731
|
-
shapev[0] = shapem[0];
|
732
|
-
qr = na_make_object(NA_DFLOAT, 2, shapem, CLASS_OF(argv[0]));
|
733
|
-
tau = na_make_object(NA_DFLOAT, 1, shapev, cNVector);
|
734
|
-
memcpy(NA_PTR_TYPE(qr,double*),na->ptr,sizeof(double)*shapem[0]*shapem[1]);
|
735
|
-
mv = gsl_matrix_view_array(NA_PTR_TYPE(qr,double*), shapem[0], shapem[1]);
|
736
|
-
vv = gsl_vector_view_array(NA_PTR_TYPE(tau,double*), shapev[0]);
|
737
|
-
gsl_linalg_QR_decomp(&mv.matrix, &vv.vector);
|
738
|
-
return rb_ary_new3(2, qr, tau);
|
739
|
-
}
|
740
|
-
|
741
872
|
static VALUE rb_gsl_linalg_QR_unpack_narray(int argc, VALUE *argv, VALUE obj)
|
742
873
|
{
|
743
874
|
struct NARRAY *m, *tau;
|
@@ -798,7 +929,50 @@ static VALUE rb_gsl_linalg_QR_svx_narray(int argc, VALUE *argv, VALUE obj)
|
|
798
929
|
gsl_linalg_QR_svx(&mv.matrix, &tv.vector, &bv.vector);
|
799
930
|
return argv[2];
|
800
931
|
}
|
932
|
+
static VALUE rb_gsl_linalg_QR_decomp_narray(int argc, VALUE *argv, VALUE obj)
|
933
|
+
{
|
934
|
+
struct NARRAY *na;
|
935
|
+
gsl_matrix_view mv;
|
936
|
+
gsl_vector_view vv;
|
937
|
+
int shapem[2], shapev[1];
|
938
|
+
VALUE qr, tau;
|
939
|
+
if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
|
940
|
+
GetNArray(argv[0], na);
|
941
|
+
shapem[0] = na->shape[1];
|
942
|
+
shapem[1] = na->shape[1];
|
943
|
+
shapev[0] = shapem[0];
|
944
|
+
qr = na_make_object(NA_DFLOAT, 2, shapem, CLASS_OF(argv[0]));
|
945
|
+
tau = na_make_object(NA_DFLOAT, 1, shapev, cNVector);
|
946
|
+
memcpy(NA_PTR_TYPE(qr,double*),na->ptr,sizeof(double)*shapem[0]*shapem[1]);
|
947
|
+
mv = gsl_matrix_view_array(NA_PTR_TYPE(qr,double*), shapem[0], shapem[1]);
|
948
|
+
vv = gsl_vector_view_array(NA_PTR_TYPE(tau,double*), shapev[0]);
|
949
|
+
gsl_linalg_QR_decomp(&mv.matrix, &vv.vector);
|
950
|
+
return rb_ary_new3(2, qr, tau);
|
951
|
+
}
|
952
|
+
#endif
|
801
953
|
|
954
|
+
#ifdef HAVE_NMATRIX_H
|
955
|
+
static VALUE rb_gsl_linalg_QR_decomp_nmatrix(int argc, VALUE *argv, VALUE obj)
|
956
|
+
{
|
957
|
+
NM_DENSE_STORAGE *nm;
|
958
|
+
gsl_matrix_view mv;
|
959
|
+
gsl_vector_view vv;
|
960
|
+
unsigned shapem[2], shapev[1];
|
961
|
+
VALUE qr, tau;
|
962
|
+
|
963
|
+
if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
|
964
|
+
nm = NM_STORAGE_DENSE(argv[0]);
|
965
|
+
shapem[0] = nm->shape[1];
|
966
|
+
shapem[1] = nm->shape[1];
|
967
|
+
shapev[0] = shapem[0];
|
968
|
+
qr = rb_nmatrix_dense_create(FLOAT64, shapem, 2, nm->elements,
|
969
|
+
shapem[0]*shapem[1]);
|
970
|
+
tau = rb_nmatrix_dense_create(FLOAT64, shapev, 1, nm->elements, shapev[0]);
|
971
|
+
mv = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(qr), shapem[0], shapem[1]);
|
972
|
+
vv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(tau), shapev[0]);
|
973
|
+
gsl_linalg_QR_decomp(&mv.matrix, &vv.vector);
|
974
|
+
return rb_ary_new3(2, qr, tau);
|
975
|
+
}
|
802
976
|
#endif
|
803
977
|
|
804
978
|
static VALUE rb_gsl_linalg_QR_decomp(int argc, VALUE *argv, VALUE obj)
|
@@ -807,6 +981,12 @@ static VALUE rb_gsl_linalg_QR_decomp(int argc, VALUE *argv, VALUE obj)
|
|
807
981
|
if (argc >= 1 && NA_IsNArray(argv[0]))
|
808
982
|
return rb_gsl_linalg_QR_decomp_narray(argc, argv, obj);
|
809
983
|
#endif
|
984
|
+
|
985
|
+
#ifdef HAVE_NMATRIX_H
|
986
|
+
if (argc >= 1 && NM_IsNMatrix(argv[0]))
|
987
|
+
return rb_gsl_linalg_QR_decomp_nmatrix(argc, argv, obj);
|
988
|
+
#endif
|
989
|
+
|
810
990
|
return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_QR_DECOMP);
|
811
991
|
}
|
812
992
|
|
@@ -1062,12 +1242,41 @@ static VALUE rb_gsl_linalg_QR_LQ_lssolve(int argc, VALUE *argv, VALUE obj, int f
|
|
1062
1242
|
return Qnil;
|
1063
1243
|
}
|
1064
1244
|
|
1245
|
+
#ifdef HAVE_NMATRIX_H
|
1246
|
+
static VALUE rb_gsl_linalg_QR_solve_nmatrix(int argc, VALUE *argv, VALUE obj)
|
1247
|
+
{
|
1248
|
+
NM_DENSE_STORAGE *qr, *tau, *b;
|
1249
|
+
VALUE x;
|
1250
|
+
gsl_matrix_view mv;
|
1251
|
+
gsl_vector_view tv, bv, xv;
|
1252
|
+
|
1253
|
+
if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
|
1254
|
+
qr = NM_STORAGE_DENSE(argv[0]);
|
1255
|
+
tau = NM_STORAGE_DENSE(argv[1]);
|
1256
|
+
b = NM_STORAGE_DENSE(argv[2]);
|
1257
|
+
|
1258
|
+
x = rb_nmatrix_dense_create(FLOAT64, b->shape, 1, b->elements, b->shape[0]);
|
1259
|
+
mv = gsl_matrix_view_array((double*)qr->elements, qr->shape[0], qr->shape[1]);
|
1260
|
+
tv = gsl_vector_view_array((double*)tau->elements, tau->shape[0]);
|
1261
|
+
bv = gsl_vector_view_array((double*)b->elements, b->shape[0]);
|
1262
|
+
xv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(x), b->shape[0]);
|
1263
|
+
gsl_linalg_QR_solve(&mv.matrix, &tv.vector, &bv.vector, &xv.vector);
|
1264
|
+
return x;
|
1265
|
+
}
|
1266
|
+
#endif
|
1267
|
+
|
1065
1268
|
static VALUE rb_gsl_linalg_QR_solve(int argc, VALUE *argv, VALUE obj)
|
1066
1269
|
{
|
1067
1270
|
#ifdef HAVE_NARRAY_H
|
1068
1271
|
if (argc == 3 && NA_IsNArray(argv[0]))
|
1069
1272
|
return rb_gsl_linalg_QR_solve_narray(argc, argv, obj);
|
1070
1273
|
#endif
|
1274
|
+
|
1275
|
+
#ifdef HAVE_NMATRIX_H
|
1276
|
+
if (argc == 3 && NM_IsNMatrix(argv[0])) {
|
1277
|
+
return rb_gsl_linalg_QR_solve_nmatrix(argc, argv, obj);
|
1278
|
+
}
|
1279
|
+
#endif
|
1071
1280
|
return rb_gsl_linalg_QR_LQ_solve(argc, argv, obj, LINALG_QR_SOLVE);
|
1072
1281
|
}
|
1073
1282
|
|
@@ -2224,6 +2433,32 @@ static VALUE rb_gsl_linalg_SV_solve_narray(int argc, VALUE *argv, VALUE obj)
|
|
2224
2433
|
|
2225
2434
|
#endif
|
2226
2435
|
|
2436
|
+
#ifdef HAVE_NMATRIX_H
|
2437
|
+
static VALUE rb_gsl_linalg_SV_decomp_nmatrix(int argc, VALUE *argv, VALUE obj)
|
2438
|
+
{
|
2439
|
+
NM_DENSE_STORAGE *A;
|
2440
|
+
gsl_matrix_view uv, vv;
|
2441
|
+
gsl_vector_view sv;
|
2442
|
+
gsl_vector *work;
|
2443
|
+
VALUE u, s, v;
|
2444
|
+
unsigned shape[2];
|
2445
|
+
|
2446
|
+
A = NM_STORAGE_DENSE(argv[0]);
|
2447
|
+
shape[0] = A->shape[0];
|
2448
|
+
shape[1] = A->shape[1];
|
2449
|
+
u = rb_nmatrix_dense_create(FLOAT64, A->shape, 2, A->elements, shape[0]*shape[1]);
|
2450
|
+
v = rb_nmatrix_dense_create(FLOAT64, shape, 2, A->elements, shape[0]*shape[0]);
|
2451
|
+
s = rb_nvector_dense_create(FLOAT64, A->elements, shape[0]);
|
2452
|
+
uv = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(u), shape[1], shape[0]);
|
2453
|
+
vv = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(v), shape[0], shape[0]);
|
2454
|
+
sv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(s), shape[0]);
|
2455
|
+
work = gsl_vector_alloc(shape[0]);
|
2456
|
+
gsl_linalg_SV_decomp(&uv.matrix, &vv.matrix, &sv.vector, work);
|
2457
|
+
gsl_vector_free(work);
|
2458
|
+
return rb_ary_new3(3, u, v, s);
|
2459
|
+
}
|
2460
|
+
#endif
|
2461
|
+
|
2227
2462
|
static VALUE rb_gsl_linalg_SV_decomp(int argc, VALUE *argv, VALUE obj)
|
2228
2463
|
{
|
2229
2464
|
gsl_matrix *A = NULL, *V = NULL, *U = NULL;
|
@@ -2243,6 +2478,12 @@ static VALUE rb_gsl_linalg_SV_decomp(int argc, VALUE *argv, VALUE obj)
|
|
2243
2478
|
if (NA_IsNArray(argv[0]))
|
2244
2479
|
return rb_gsl_linalg_SV_decomp_narray(argc, argv, obj);
|
2245
2480
|
#endif
|
2481
|
+
|
2482
|
+
#ifdef HAVE_NMATRIX_H
|
2483
|
+
if (NM_IsNMatrix(argv[0])) {
|
2484
|
+
return rb_gsl_linalg_SV_decomp_nmatrix(argc, argv, obj);
|
2485
|
+
}
|
2486
|
+
#endif
|
2246
2487
|
CHECK_MATRIX(argv[0]);
|
2247
2488
|
Data_Get_Struct(argv[0], gsl_matrix, A);
|
2248
2489
|
break;
|
@@ -2340,6 +2581,28 @@ static VALUE rb_gsl_linalg_SV_decomp_jacobi(int argc, VALUE *argv, VALUE obj)
|
|
2340
2581
|
return rb_ary_new3(3, vu, vv, vs);
|
2341
2582
|
}
|
2342
2583
|
|
2584
|
+
#ifdef HAVE_NMATRIX_H
|
2585
|
+
static VALUE rb_gsl_linalg_SV_solve_nmatrix(int argc, VALUE *argv, VALUE obj)
|
2586
|
+
{
|
2587
|
+
NM_DENSE_STORAGE *A;
|
2588
|
+
gsl_matrix_view uv, vv;
|
2589
|
+
gsl_vector_view sv, bv, xv;
|
2590
|
+
VALUE x;
|
2591
|
+
if (argc != 4){
|
2592
|
+
rb_raise(rb_eArgError, "Usage: SV.solve(u, v, s, b)");
|
2593
|
+
}
|
2594
|
+
A = NM_STORAGE_DENSE(argv[0]);
|
2595
|
+
uv = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(argv[0]), A->shape[0], A->shape[1]);
|
2596
|
+
vv = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(argv[1]), A->shape[0], A->shape[0]);
|
2597
|
+
sv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(argv[2]), A->shape[0]);
|
2598
|
+
bv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(argv[3]), A->shape[0]);
|
2599
|
+
x = rb_nvector_dense_create(FLOAT64, (double*)NM_DENSE_ELEMENTS(argv[3]), A->shape[0]);
|
2600
|
+
xv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(x), A->shape[0]);
|
2601
|
+
gsl_linalg_SV_solve(&uv.matrix, &vv.matrix, &sv.vector, &bv.vector, &xv.vector);
|
2602
|
+
return x;
|
2603
|
+
}
|
2604
|
+
#endif
|
2605
|
+
|
2343
2606
|
static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
|
2344
2607
|
{
|
2345
2608
|
gsl_matrix *A = NULL, *U = NULL, *V = NULL;
|
@@ -2354,6 +2617,11 @@ static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
|
|
2354
2617
|
return rb_gsl_linalg_SV_solve_narray(argc, argv, obj);
|
2355
2618
|
#endif
|
2356
2619
|
|
2620
|
+
#ifdef HAVE_NMATRIX_H
|
2621
|
+
if (NM_IsNMatrix(argv[0]))
|
2622
|
+
return rb_gsl_linalg_SV_solve_nmatrix(argc, argv, obj);
|
2623
|
+
#endif
|
2624
|
+
|
2357
2625
|
CHECK_MATRIX(argv[0]);
|
2358
2626
|
if (CLASS_OF(argv[0]) == cgsl_matrix_U) {
|
2359
2627
|
if (argc != 4) rb_raise(rb_eArgError,
|
@@ -2479,7 +2747,23 @@ static VALUE rb_gsl_linalg_cholesky_svx_narray(int argc, VALUE *argv, VALUE obj)
|
|
2479
2747
|
gsl_linalg_cholesky_svx(&mv.matrix, &bv.vector);
|
2480
2748
|
return argv[1];
|
2481
2749
|
}
|
2750
|
+
#endif
|
2482
2751
|
|
2752
|
+
#ifdef HAVE_NMATRIX_H
|
2753
|
+
static VALUE rb_gsl_linalg_cholesky_decomp_nmatrix(int argc, VALUE *argv, VALUE obj)
|
2754
|
+
{
|
2755
|
+
NM_DENSE_STORAGE *nm;
|
2756
|
+
VALUE chol;
|
2757
|
+
gsl_matrix_view mv;
|
2758
|
+
nm = NM_STORAGE_DENSE(argv[0]);
|
2759
|
+
|
2760
|
+
chol = rb_nmatrix_dense_create(FLOAT64, nm->shape, 2, nm->elements,
|
2761
|
+
nm->shape[0]*nm->shape[1]);
|
2762
|
+
mv = gsl_matrix_view_array((double*)NM_DENSE_ELEMENTS(chol), nm->shape[0],
|
2763
|
+
nm->shape[1]);
|
2764
|
+
gsl_linalg_cholesky_decomp(&mv.matrix);
|
2765
|
+
return chol;
|
2766
|
+
}
|
2483
2767
|
#endif
|
2484
2768
|
|
2485
2769
|
static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
|
@@ -2493,6 +2777,11 @@ static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
|
|
2493
2777
|
if (NA_IsNArray(argv[0]))
|
2494
2778
|
return rb_gsl_linalg_cholesky_decomp_narray(argc, argv, obj);
|
2495
2779
|
#endif
|
2780
|
+
|
2781
|
+
#ifdef HAVE_NMATRIX_H
|
2782
|
+
if (NM_IsNMatrix(argv[0]))
|
2783
|
+
return rb_gsl_linalg_cholesky_decomp_nmatrix(argc, argv, obj);
|
2784
|
+
#endif
|
2496
2785
|
CHECK_MATRIX(argv[0]);
|
2497
2786
|
Data_Get_Struct(argv[0], gsl_matrix, Atmp);
|
2498
2787
|
break;
|
@@ -2506,6 +2795,36 @@ static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
|
|
2506
2795
|
return Data_Wrap_Struct(cgsl_matrix_C, 0, gsl_matrix_free, A);
|
2507
2796
|
}
|
2508
2797
|
|
2798
|
+
#ifdef HAVE_NMATRIX_H
|
2799
|
+
static VALUE rb_gsl_linalg_cholesky_solve_nmatrix(int argc, VALUE *argv, VALUE obj)
|
2800
|
+
{
|
2801
|
+
NM_DENSE_STORAGE *nm, *nb;
|
2802
|
+
VALUE x;
|
2803
|
+
gsl_matrix_view mv;
|
2804
|
+
gsl_vector_view bv, xv;
|
2805
|
+
|
2806
|
+
nm = NM_STORAGE_DENSE(argv[0]);
|
2807
|
+
nb = NM_STORAGE_DENSE(argv[1]);
|
2808
|
+
switch (argc) {
|
2809
|
+
case 2:
|
2810
|
+
x = rb_nvector_dense_create(FLOAT64, nb->elements, nb->shape[0]);
|
2811
|
+
break;
|
2812
|
+
case 3:
|
2813
|
+
x = argv[2];
|
2814
|
+
break;
|
2815
|
+
default:
|
2816
|
+
rb_raise(rb_eArgError,
|
2817
|
+
"Usage: Cholesky.solve(chol, b) or Cholesky.solve(chol, b, x)");
|
2818
|
+
break;
|
2819
|
+
}
|
2820
|
+
mv = gsl_matrix_view_array((double*)nm->elements, nm->shape[0], nm->shape[1]);
|
2821
|
+
bv = gsl_vector_view_array((double*)nb->elements, nb->shape[0]);
|
2822
|
+
xv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(x), nb->shape[0]);
|
2823
|
+
gsl_linalg_cholesky_solve(&mv.matrix, &bv.vector, &xv.vector);
|
2824
|
+
return x;
|
2825
|
+
}
|
2826
|
+
#endif
|
2827
|
+
|
2509
2828
|
static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
|
2510
2829
|
{
|
2511
2830
|
gsl_matrix *A = NULL, *Atmp = NULL;
|
@@ -2520,6 +2839,11 @@ static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
|
|
2520
2839
|
if (NA_IsNArray(argv[0]))
|
2521
2840
|
return rb_gsl_linalg_cholesky_solve_narray(argc, argv, obj);
|
2522
2841
|
#endif
|
2842
|
+
|
2843
|
+
#ifdef HAVE_NMATRIX_H
|
2844
|
+
if (NM_IsNMatrix(argv[0]))
|
2845
|
+
return rb_gsl_linalg_cholesky_solve_nmatrix(argc, argv, obj);
|
2846
|
+
#endif
|
2523
2847
|
vA = argv[0];
|
2524
2848
|
vb = argv[1];
|
2525
2849
|
break;
|
@@ -2553,6 +2877,22 @@ static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
|
|
2553
2877
|
return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
|
2554
2878
|
}
|
2555
2879
|
|
2880
|
+
#ifdef HAVE_NMATRIX_H
|
2881
|
+
static VALUE rb_gsl_linalg_cholesky_svx_nmatrix(int argc, VALUE *argv, VALUE obj)
|
2882
|
+
{
|
2883
|
+
NM_DENSE_STORAGE *nm, *nb;
|
2884
|
+
gsl_matrix_view mv;
|
2885
|
+
gsl_vector_view bv;
|
2886
|
+
nm = NM_STORAGE_DENSE(argv[0]);
|
2887
|
+
nb = NM_STORAGE_DENSE(argv[1]);
|
2888
|
+
|
2889
|
+
mv = gsl_matrix_view_array((double*)nm->elements, nm->shape[0], nm->shape[1]);
|
2890
|
+
bv = gsl_vector_view_array((double*)nb->elements, nb->shape[0]);
|
2891
|
+
gsl_linalg_cholesky_svx(&mv.matrix, &bv.vector);
|
2892
|
+
|
2893
|
+
return argv[1];
|
2894
|
+
}
|
2895
|
+
#endif
|
2556
2896
|
|
2557
2897
|
static VALUE rb_gsl_linalg_cholesky_svx(int argc, VALUE *argv, VALUE obj)
|
2558
2898
|
{
|
@@ -2568,6 +2908,11 @@ static VALUE rb_gsl_linalg_cholesky_svx(int argc, VALUE *argv, VALUE obj)
|
|
2568
2908
|
if (NA_IsNArray(argv[0]))
|
2569
2909
|
return rb_gsl_linalg_cholesky_svx_narray(argc, argv, obj);
|
2570
2910
|
#endif
|
2911
|
+
|
2912
|
+
#ifdef HAVE_NMATRIX_H
|
2913
|
+
if (NM_IsNMatrix(argv[0]))
|
2914
|
+
return rb_gsl_linalg_cholesky_svx_nmatrix(argc, argv, obj);
|
2915
|
+
#endif
|
2571
2916
|
vA = argv[0];
|
2572
2917
|
vb = argv[1];
|
2573
2918
|
break;
|
@@ -3062,6 +3407,26 @@ static VALUE rb_gsl_linalg_HH_svx_narray(int argc, VALUE *argv, VALUE obj)
|
|
3062
3407
|
}
|
3063
3408
|
#endif
|
3064
3409
|
|
3410
|
+
#ifdef HAVE_NMATRIX_H
|
3411
|
+
static VALUE rb_gsl_linalg_HH_solve_nmatrix(int argc, VALUE *argv, VALUE obj)
|
3412
|
+
{
|
3413
|
+
NM_DENSE_STORAGE *nm;
|
3414
|
+
gsl_vector_view bv, xv;
|
3415
|
+
VALUE x;
|
3416
|
+
gsl_matrix *mtmp;
|
3417
|
+
|
3418
|
+
nm = NM_STORAGE_DENSE(argv[0]);
|
3419
|
+
bv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(argv[1]), nm->shape[0]);
|
3420
|
+
x = rb_nvector_dense_create(FLOAT64, nm->elements, nm->shape[0]);
|
3421
|
+
xv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(x), nm->shape[0]);
|
3422
|
+
mtmp = gsl_matrix_alloc(nm->shape[0], nm->shape[1]);
|
3423
|
+
memcpy(mtmp->data, (double*)nm->elements, sizeof(double)*nm->shape[0]*nm->shape[1]);
|
3424
|
+
gsl_linalg_HH_solve(mtmp, &bv.vector, &xv.vector);
|
3425
|
+
gsl_matrix_free(mtmp);
|
3426
|
+
return x;
|
3427
|
+
}
|
3428
|
+
#endif
|
3429
|
+
|
3065
3430
|
/* 17.Apr.2004 */
|
3066
3431
|
static VALUE rb_gsl_linalg_HH_solve(int argc, VALUE *argv, VALUE obj)
|
3067
3432
|
{
|
@@ -3077,6 +3442,11 @@ static VALUE rb_gsl_linalg_HH_solve(int argc, VALUE *argv, VALUE obj)
|
|
3077
3442
|
if (NA_IsNArray(argv[0]))
|
3078
3443
|
return rb_gsl_linalg_HH_solve_narray(argc, argv, obj);
|
3079
3444
|
#endif
|
3445
|
+
|
3446
|
+
#ifdef HAVE_NMATRIX_H
|
3447
|
+
if (NM_IsNMatrix(argv[0]))
|
3448
|
+
return rb_gsl_linalg_HH_solve_nmatrix(argc, argv, obj);
|
3449
|
+
#endif
|
3080
3450
|
vA = argv[0];
|
3081
3451
|
vb = argv[1];
|
3082
3452
|
break;
|
@@ -3139,6 +3509,23 @@ static VALUE rb_gsl_linalg_HH_solve_bang(int argc, VALUE *argv, VALUE obj)
|
|
3139
3509
|
return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
|
3140
3510
|
}
|
3141
3511
|
|
3512
|
+
#ifdef HAVE_NMATRIX_H
|
3513
|
+
static VALUE rb_gsl_linalg_HH_svx_nmatrix(int argc, VALUE *argv, VALUE obj)
|
3514
|
+
{
|
3515
|
+
NM_DENSE_STORAGE *nm;
|
3516
|
+
gsl_matrix *mtmp;
|
3517
|
+
gsl_vector_view bv;
|
3518
|
+
|
3519
|
+
nm = NM_STORAGE_DENSE(argv[0]);
|
3520
|
+
bv = gsl_vector_view_array((double*)NM_DENSE_ELEMENTS(argv[1]), nm->shape[0]);
|
3521
|
+
mtmp = gsl_matrix_alloc(nm->shape[0], nm->shape[1]);
|
3522
|
+
memcpy(mtmp->data, (double*)nm->elements, sizeof(double)*nm->shape[0]*nm->shape[1]);
|
3523
|
+
gsl_linalg_HH_svx(mtmp, &bv.vector);
|
3524
|
+
gsl_matrix_free(mtmp);
|
3525
|
+
return argv[1];
|
3526
|
+
}
|
3527
|
+
#endif
|
3528
|
+
|
3142
3529
|
static VALUE rb_gsl_linalg_HH_svx(int argc, VALUE *argv, VALUE obj)
|
3143
3530
|
{
|
3144
3531
|
gsl_matrix *A = NULL, *Atmp = NULL;
|
@@ -3152,6 +3539,11 @@ static VALUE rb_gsl_linalg_HH_svx(int argc, VALUE *argv, VALUE obj)
|
|
3152
3539
|
if (NA_IsNArray(argv[0]))
|
3153
3540
|
return rb_gsl_linalg_HH_svx_narray(argc, argv, obj);
|
3154
3541
|
#endif
|
3542
|
+
|
3543
|
+
#ifdef HAVE_NMATRIX_H
|
3544
|
+
if (NM_IsNMatrix(argv[0]))
|
3545
|
+
return rb_gsl_linalg_HH_svx_nmatrix(argc, argv, obj);
|
3546
|
+
#endif
|
3155
3547
|
vA = argv[0];
|
3156
3548
|
vb = argv[1];
|
3157
3549
|
break;
|