gsl 1.16.0.6 → 2.1.0
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.
- 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;
|