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.
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;