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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -13
  3. data/ChangeLog +6 -0
  4. data/Gemfile +1 -0
  5. data/README.md +77 -1
  6. data/Rakefile +7 -1
  7. data/examples/linalg/QR_solve_narray.rb +2 -1
  8. data/examples/linalg/SV_narray.rb +10 -0
  9. data/examples/linalg/chol_narray.rb +3 -0
  10. data/examples/wavelet/wavelet1.rb +4 -2
  11. data/ext/gsl_native/array.c +10 -0
  12. data/ext/gsl_native/bspline.c +15 -2
  13. data/ext/gsl_native/cheb.c +76 -10
  14. data/ext/gsl_native/common.c +33 -0
  15. data/ext/gsl_native/dht.c +26 -0
  16. data/ext/gsl_native/eigen.c +129 -0
  17. data/ext/gsl_native/extconf.rb +60 -6
  18. data/ext/gsl_native/fft.c +42 -0
  19. data/ext/gsl_native/function.c +18 -0
  20. data/ext/gsl_native/gsl.c +5 -0
  21. data/ext/gsl_native/gsl_nmatrix.c +204 -0
  22. data/ext/gsl_native/histogram.c +42 -0
  23. data/ext/gsl_native/include/rb_gsl.h +4 -0
  24. data/ext/gsl_native/include/rb_gsl_array.h +4 -0
  25. data/ext/gsl_native/include/rb_gsl_common.h +5 -0
  26. data/ext/gsl_native/include/rb_gsl_interp.h +4 -0
  27. data/ext/gsl_native/include/rb_gsl_with_nmatrix.h +28 -0
  28. data/ext/gsl_native/interp.c +14 -0
  29. data/ext/gsl_native/linalg.c +414 -22
  30. data/ext/gsl_native/math.c +64 -0
  31. data/ext/gsl_native/multifit.c +61 -0
  32. data/ext/gsl_native/randist.c +42 -0
  33. data/ext/gsl_native/sf.c +6 -0
  34. data/ext/gsl_native/sf_ellint.c +4 -4
  35. data/ext/gsl_native/sf_mathieu.c +48 -0
  36. data/ext/gsl_native/spline.c +30 -0
  37. data/ext/gsl_native/tamu_anova.c +1 -1
  38. data/gsl.gemspec +8 -1
  39. data/lib/gsl.rb +5 -0
  40. data/lib/gsl/version.rb +1 -1
  41. data/rdoc/nmatrix.rdoc +129 -0
  42. data/rdoc/ref.rdoc +1 -0
  43. data/test.sh +21 -0
  44. data/test/gsl/bspline_test.rb +15 -14
  45. data/test/gsl/combination_test.rb +17 -6
  46. data/test/gsl/dht_test.rb +42 -33
  47. data/test/gsl/nmatrix_tests/nmatrix_cheb_test.rb +34 -0
  48. data/test/gsl/nmatrix_tests/nmatrix_eigen_test.rb +28 -0
  49. data/test/gsl/nmatrix_tests/nmatrix_gsl_test.rb +65 -0
  50. data/test/gsl/nmatrix_tests/nmatrix_interp_test.rb +45 -0
  51. data/test/gsl/nmatrix_tests/nmatrix_linalg_test.rb +100 -0
  52. data/test/gsl/nmatrix_tests/nmatrix_stats_test.rb +88 -0
  53. data/test/gsl/nmatrix_tests/nmatrix_wavelet_test.rb +5 -0
  54. data/test/gsl/randist_test.rb +43 -23
  55. data/test/test_helper.rb +30 -2
  56. metadata +191 -51
@@ -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),
@@ -88,6 +88,10 @@ void Init_gsl_ieee(VALUE module);
88
88
  void Init_gsl_narray(VALUE module);
89
89
  #endif
90
90
 
91
+ #ifdef HAVE_NMATRIX_H
92
+ void Init_gsl_nmatrix(VALUE module);
93
+ #endif
94
+
91
95
  void Init_wavelet(VALUE module);
92
96
 
93
97
  void Init_gsl_graph(VALUE module);
@@ -32,6 +32,10 @@ typedef gsl_permutation gsl_index;
32
32
  EXTERN VALUE cNArray;
33
33
  #endif
34
34
 
35
+ #ifdef HAVE_NMATRIX_H
36
+ EXTERN VALUE cNMatrix;
37
+ #endif
38
+
35
39
  EXTERN VALUE cgsl_block, cgsl_block_int;
36
40
  EXTERN VALUE cgsl_block_uchar;
37
41
  EXTERN VALUE cgsl_block_complex;
@@ -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
@@ -17,6 +17,10 @@
17
17
  #include <gsl/gsl_interp.h>
18
18
  #include <gsl/gsl_spline.h>
19
19
 
20
+ #ifdef HAVE_NMATRIX_H
21
+ #include "include/rb_gsl_with_nmatrix.h"
22
+ #endif
23
+
20
24
  typedef struct {
21
25
  gsl_interp *p;
22
26
  gsl_interp_accel *a;
@@ -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
@@ -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);
@@ -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;