rb-gsl 1.16.0.5 → 1.16.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (612) hide show
  1. checksums.yaml +4 -4
  2. data/rb-gsl.gemspec +5 -10
  3. metadata +10 -713
  4. data/.gitignore +0 -12
  5. data/.travis.yml +0 -24
  6. data/AUTHORS +0 -12
  7. data/COPYING +0 -341
  8. data/ChangeLog +0 -621
  9. data/Gemfile +0 -4
  10. data/README.md +0 -77
  11. data/Rakefile +0 -20
  12. data/THANKS +0 -17
  13. data/examples/alf/alf.gp +0 -15
  14. data/examples/alf/alf.rb +0 -32
  15. data/examples/blas/blas.rb +0 -13
  16. data/examples/blas/dnrm2.rb +0 -16
  17. data/examples/blas/level1.rb +0 -81
  18. data/examples/blas/level2.rb +0 -11
  19. data/examples/blas/level3.rb +0 -12
  20. data/examples/bspline.rb +0 -57
  21. data/examples/cdf.rb +0 -16
  22. data/examples/cheb.rb +0 -21
  23. data/examples/combination.rb +0 -23
  24. data/examples/complex/RC-lpf.rb +0 -47
  25. data/examples/complex/add.rb +0 -36
  26. data/examples/complex/coerce.rb +0 -14
  27. data/examples/complex/complex.rb +0 -25
  28. data/examples/complex/fpmi.rb +0 -70
  29. data/examples/complex/functions.rb +0 -77
  30. data/examples/complex/michelson.rb +0 -36
  31. data/examples/complex/mul.rb +0 -28
  32. data/examples/complex/oscillator.rb +0 -17
  33. data/examples/complex/set.rb +0 -37
  34. data/examples/const/physconst.rb +0 -151
  35. data/examples/const/travel.rb +0 -45
  36. data/examples/deriv/demo.rb +0 -13
  37. data/examples/deriv/deriv.rb +0 -36
  38. data/examples/deriv/diff.rb +0 -35
  39. data/examples/dht.rb +0 -42
  40. data/examples/dirac.rb +0 -56
  41. data/examples/eigen/eigen.rb +0 -34
  42. data/examples/eigen/herm.rb +0 -22
  43. data/examples/eigen/narray.rb +0 -9
  44. data/examples/eigen/nonsymm.rb +0 -37
  45. data/examples/eigen/nonsymmv.rb +0 -43
  46. data/examples/eigen/qhoscillator.gp +0 -35
  47. data/examples/eigen/qhoscillator.rb +0 -90
  48. data/examples/eigen/vander.rb +0 -41
  49. data/examples/fft/fft.rb +0 -17
  50. data/examples/fft/fft2.rb +0 -17
  51. data/examples/fft/forward.rb +0 -25
  52. data/examples/fft/forward2.rb +0 -26
  53. data/examples/fft/radix2.rb +0 -18
  54. data/examples/fft/real-halfcomplex.rb +0 -33
  55. data/examples/fft/real-halfcomplex2.rb +0 -30
  56. data/examples/fft/realradix2.rb +0 -19
  57. data/examples/fft/sunspot.dat +0 -256
  58. data/examples/fft/sunspot.rb +0 -16
  59. data/examples/fit/expdata.dat +0 -20
  60. data/examples/fit/expfit.rb +0 -31
  61. data/examples/fit/gaussfit.rb +0 -29
  62. data/examples/fit/gaussian_2peaks.rb +0 -34
  63. data/examples/fit/hillfit.rb +0 -40
  64. data/examples/fit/lognormal.rb +0 -26
  65. data/examples/fit/lorentzfit.rb +0 -22
  66. data/examples/fit/multifit.rb +0 -72
  67. data/examples/fit/ndlinear.rb +0 -133
  68. data/examples/fit/nonlinearfit.rb +0 -89
  69. data/examples/fit/plot.gp +0 -36
  70. data/examples/fit/polyfit.rb +0 -9
  71. data/examples/fit/powerfit.rb +0 -21
  72. data/examples/fit/sigmoidfit.rb +0 -40
  73. data/examples/fit/sinfit.rb +0 -22
  74. data/examples/fit/wlinear.rb +0 -46
  75. data/examples/fresnel.rb +0 -11
  76. data/examples/function/function.rb +0 -36
  77. data/examples/function/log.rb +0 -7
  78. data/examples/function/min.rb +0 -33
  79. data/examples/function/sin.rb +0 -10
  80. data/examples/function/synchrotron.rb +0 -18
  81. data/examples/gallery/butterfly.rb +0 -7
  82. data/examples/gallery/cayley.rb +0 -12
  83. data/examples/gallery/cornu.rb +0 -23
  84. data/examples/gallery/eight.rb +0 -11
  85. data/examples/gallery/koch.rb +0 -40
  86. data/examples/gallery/lemniscate.rb +0 -11
  87. data/examples/gallery/polar.rb +0 -11
  88. data/examples/gallery/rgplot/cossin.rb +0 -35
  89. data/examples/gallery/rgplot/rgplot.replaced +0 -0
  90. data/examples/gallery/rgplot/roesller.rb +0 -55
  91. data/examples/gallery/roesller.rb +0 -39
  92. data/examples/gallery/scarabaeus.rb +0 -14
  93. data/examples/histogram/cauchy.rb +0 -27
  94. data/examples/histogram/cauchy.sh +0 -2
  95. data/examples/histogram/exponential.rb +0 -19
  96. data/examples/histogram/gauss.rb +0 -16
  97. data/examples/histogram/gsl-histogram.rb +0 -40
  98. data/examples/histogram/histo2d.rb +0 -31
  99. data/examples/histogram/histo3d.rb +0 -34
  100. data/examples/histogram/histogram-pdf.rb +0 -27
  101. data/examples/histogram/histogram.rb +0 -26
  102. data/examples/histogram/integral.rb +0 -28
  103. data/examples/histogram/poisson.rb +0 -27
  104. data/examples/histogram/power.rb +0 -25
  105. data/examples/histogram/rebin.rb +0 -17
  106. data/examples/histogram/smp.dat +0 -5
  107. data/examples/histogram/xexp.rb +0 -21
  108. data/examples/integration/ahmed.rb +0 -21
  109. data/examples/integration/cosmology.rb +0 -75
  110. data/examples/integration/friedmann.gp +0 -16
  111. data/examples/integration/friedmann.rb +0 -35
  112. data/examples/integration/gamma-zeta.rb +0 -35
  113. data/examples/integration/integration.rb +0 -22
  114. data/examples/integration/qag.rb +0 -8
  115. data/examples/integration/qag2.rb +0 -14
  116. data/examples/integration/qag3.rb +0 -8
  117. data/examples/integration/qagi.rb +0 -28
  118. data/examples/integration/qagi2.rb +0 -49
  119. data/examples/integration/qagiu.rb +0 -29
  120. data/examples/integration/qagp.rb +0 -20
  121. data/examples/integration/qags.rb +0 -14
  122. data/examples/integration/qawc.rb +0 -18
  123. data/examples/integration/qawf.rb +0 -41
  124. data/examples/integration/qawo.rb +0 -29
  125. data/examples/integration/qaws.rb +0 -30
  126. data/examples/integration/qng.rb +0 -17
  127. data/examples/interp/demo.gp +0 -20
  128. data/examples/interp/demo.rb +0 -45
  129. data/examples/interp/interp.rb +0 -37
  130. data/examples/interp/points +0 -10
  131. data/examples/interp/spline.rb +0 -20
  132. data/examples/jacobi/deriv.rb +0 -40
  133. data/examples/jacobi/integrate.rb +0 -34
  134. data/examples/jacobi/interp.rb +0 -43
  135. data/examples/jacobi/jacobi.rb +0 -11
  136. data/examples/linalg/HH.rb +0 -15
  137. data/examples/linalg/HH_narray.rb +0 -13
  138. data/examples/linalg/LQ_solve.rb +0 -73
  139. data/examples/linalg/LU.rb +0 -84
  140. data/examples/linalg/LU2.rb +0 -31
  141. data/examples/linalg/LU_narray.rb +0 -24
  142. data/examples/linalg/PTLQ.rb +0 -47
  143. data/examples/linalg/QR.rb +0 -18
  144. data/examples/linalg/QRPT.rb +0 -47
  145. data/examples/linalg/QR_solve.rb +0 -78
  146. data/examples/linalg/QR_solve_narray.rb +0 -13
  147. data/examples/linalg/SV.rb +0 -16
  148. data/examples/linalg/SV_narray.rb +0 -12
  149. data/examples/linalg/SV_solve.rb +0 -49
  150. data/examples/linalg/chol.rb +0 -29
  151. data/examples/linalg/chol_narray.rb +0 -15
  152. data/examples/linalg/complex.rb +0 -57
  153. data/examples/linalg/invert_narray.rb +0 -10
  154. data/examples/math/const.rb +0 -67
  155. data/examples/math/elementary.rb +0 -35
  156. data/examples/math/functions.rb +0 -41
  157. data/examples/math/inf_nan.rb +0 -34
  158. data/examples/math/minmax.rb +0 -22
  159. data/examples/math/power.rb +0 -18
  160. data/examples/math/test.rb +0 -31
  161. data/examples/matrix/a.dat +0 -0
  162. data/examples/matrix/add.rb +0 -45
  163. data/examples/matrix/b.dat +0 -4
  164. data/examples/matrix/cat.rb +0 -31
  165. data/examples/matrix/colvectors.rb +0 -24
  166. data/examples/matrix/complex.rb +0 -41
  167. data/examples/matrix/det.rb +0 -29
  168. data/examples/matrix/diagonal.rb +0 -23
  169. data/examples/matrix/get_all.rb +0 -159
  170. data/examples/matrix/hilbert.rb +0 -31
  171. data/examples/matrix/iterator.rb +0 -19
  172. data/examples/matrix/matrix.rb +0 -57
  173. data/examples/matrix/minmax.rb +0 -53
  174. data/examples/matrix/mul.rb +0 -39
  175. data/examples/matrix/rand.rb +0 -20
  176. data/examples/matrix/read.rb +0 -29
  177. data/examples/matrix/rowcol.rb +0 -47
  178. data/examples/matrix/set.rb +0 -41
  179. data/examples/matrix/set_all.rb +0 -100
  180. data/examples/matrix/view.rb +0 -32
  181. data/examples/matrix/view_all.rb +0 -148
  182. data/examples/matrix/write.rb +0 -23
  183. data/examples/min.rb +0 -29
  184. data/examples/monte/miser.rb +0 -47
  185. data/examples/monte/monte.rb +0 -47
  186. data/examples/monte/plain.rb +0 -47
  187. data/examples/monte/vegas.rb +0 -46
  188. data/examples/multimin/bundle.rb +0 -66
  189. data/examples/multimin/cqp.rb +0 -109
  190. data/examples/multimin/fdfminimizer.rb +0 -40
  191. data/examples/multimin/fminimizer.rb +0 -41
  192. data/examples/multiroot/demo.rb +0 -36
  193. data/examples/multiroot/fdfsolver.rb +0 -50
  194. data/examples/multiroot/fsolver.rb +0 -33
  195. data/examples/multiroot/fsolver2.rb +0 -32
  196. data/examples/multiroot/fsolver3.rb +0 -26
  197. data/examples/narray/histogram.rb +0 -14
  198. data/examples/narray/mandel.rb +0 -27
  199. data/examples/narray/narray.rb +0 -28
  200. data/examples/narray/narray2.rb +0 -44
  201. data/examples/narray/sf.rb +0 -26
  202. data/examples/ntuple/create.rb +0 -17
  203. data/examples/ntuple/project.rb +0 -31
  204. data/examples/odeiv/binarysystem.gp +0 -23
  205. data/examples/odeiv/binarysystem.rb +0 -104
  206. data/examples/odeiv/demo.gp +0 -24
  207. data/examples/odeiv/demo.rb +0 -69
  208. data/examples/odeiv/demo2.gp +0 -26
  209. data/examples/odeiv/duffing.rb +0 -45
  210. data/examples/odeiv/frei1.rb +0 -109
  211. data/examples/odeiv/frei2.rb +0 -76
  212. data/examples/odeiv/legendre.rb +0 -52
  213. data/examples/odeiv/odeiv.rb +0 -32
  214. data/examples/odeiv/odeiv2.rb +0 -45
  215. data/examples/odeiv/oscillator.rb +0 -42
  216. data/examples/odeiv/sedov.rb +0 -97
  217. data/examples/odeiv/whitedwarf.gp +0 -40
  218. data/examples/odeiv/whitedwarf.rb +0 -158
  219. data/examples/ool/conmin.rb +0 -100
  220. data/examples/ool/gencan.rb +0 -99
  221. data/examples/ool/pgrad.rb +0 -100
  222. data/examples/ool/spg.rb +0 -100
  223. data/examples/pdf/bernoulli.rb +0 -5
  224. data/examples/pdf/beta.rb +0 -7
  225. data/examples/pdf/binomiral.rb +0 -10
  226. data/examples/pdf/cauchy.rb +0 -6
  227. data/examples/pdf/chisq.rb +0 -8
  228. data/examples/pdf/exponential.rb +0 -7
  229. data/examples/pdf/exppow.rb +0 -6
  230. data/examples/pdf/fdist.rb +0 -7
  231. data/examples/pdf/flat.rb +0 -7
  232. data/examples/pdf/gamma.rb +0 -8
  233. data/examples/pdf/gauss-tail.rb +0 -5
  234. data/examples/pdf/gauss.rb +0 -6
  235. data/examples/pdf/geometric.rb +0 -5
  236. data/examples/pdf/gumbel.rb +0 -6
  237. data/examples/pdf/hypergeometric.rb +0 -11
  238. data/examples/pdf/landau.rb +0 -5
  239. data/examples/pdf/laplace.rb +0 -7
  240. data/examples/pdf/logarithmic.rb +0 -5
  241. data/examples/pdf/logistic.rb +0 -6
  242. data/examples/pdf/lognormal.rb +0 -6
  243. data/examples/pdf/neg-binomiral.rb +0 -10
  244. data/examples/pdf/pareto.rb +0 -7
  245. data/examples/pdf/pascal.rb +0 -10
  246. data/examples/pdf/poisson.rb +0 -5
  247. data/examples/pdf/rayleigh-tail.rb +0 -6
  248. data/examples/pdf/rayleigh.rb +0 -6
  249. data/examples/pdf/tdist.rb +0 -6
  250. data/examples/pdf/weibull.rb +0 -8
  251. data/examples/permutation/ex1.rb +0 -22
  252. data/examples/permutation/permutation.rb +0 -16
  253. data/examples/poly/bell.rb +0 -6
  254. data/examples/poly/bessel.rb +0 -6
  255. data/examples/poly/cheb.rb +0 -6
  256. data/examples/poly/cheb_II.rb +0 -6
  257. data/examples/poly/cubic.rb +0 -9
  258. data/examples/poly/demo.rb +0 -20
  259. data/examples/poly/eval.rb +0 -28
  260. data/examples/poly/eval_derivs.rb +0 -14
  261. data/examples/poly/fit.rb +0 -21
  262. data/examples/poly/hermite.rb +0 -6
  263. data/examples/poly/poly.rb +0 -13
  264. data/examples/poly/quadratic.rb +0 -25
  265. data/examples/random/diffusion.rb +0 -34
  266. data/examples/random/gaussian.rb +0 -9
  267. data/examples/random/generator.rb +0 -27
  268. data/examples/random/hdsobol.rb +0 -21
  269. data/examples/random/poisson.rb +0 -9
  270. data/examples/random/qrng.rb +0 -19
  271. data/examples/random/randomwalk.rb +0 -37
  272. data/examples/random/randomwalk2d.rb +0 -19
  273. data/examples/random/rayleigh.rb +0 -36
  274. data/examples/random/rng.rb +0 -33
  275. data/examples/random/rngextra.rb +0 -14
  276. data/examples/roots/bisection.rb +0 -25
  277. data/examples/roots/brent.rb +0 -43
  278. data/examples/roots/demo.rb +0 -30
  279. data/examples/roots/newton.rb +0 -46
  280. data/examples/roots/recombination.gp +0 -11
  281. data/examples/roots/recombination.rb +0 -61
  282. data/examples/roots/steffenson.rb +0 -48
  283. data/examples/sf/ShiChi.rb +0 -6
  284. data/examples/sf/SiCi.rb +0 -6
  285. data/examples/sf/airy_Ai.rb +0 -8
  286. data/examples/sf/airy_Bi.rb +0 -8
  287. data/examples/sf/bessel_IK.rb +0 -12
  288. data/examples/sf/bessel_JY.rb +0 -13
  289. data/examples/sf/beta_inc.rb +0 -9
  290. data/examples/sf/clausen.rb +0 -6
  291. data/examples/sf/dawson.rb +0 -5
  292. data/examples/sf/debye.rb +0 -9
  293. data/examples/sf/dilog.rb +0 -6
  294. data/examples/sf/ellint.rb +0 -6
  295. data/examples/sf/expint.rb +0 -8
  296. data/examples/sf/fermi.rb +0 -10
  297. data/examples/sf/gamma_inc_P.rb +0 -9
  298. data/examples/sf/gegenbauer.rb +0 -8
  299. data/examples/sf/hyperg.rb +0 -7
  300. data/examples/sf/laguerre.rb +0 -19
  301. data/examples/sf/lambertW.rb +0 -5
  302. data/examples/sf/legendre_P.rb +0 -10
  303. data/examples/sf/lngamma.rb +0 -5
  304. data/examples/sf/psi.rb +0 -54
  305. data/examples/sf/sphbessel.gp +0 -27
  306. data/examples/sf/sphbessel.rb +0 -30
  307. data/examples/sf/synchrotron.rb +0 -5
  308. data/examples/sf/transport.rb +0 -10
  309. data/examples/sf/zetam1.rb +0 -5
  310. data/examples/siman.rb +0 -44
  311. data/examples/sort/heapsort.rb +0 -23
  312. data/examples/sort/heapsort_vector_complex.rb +0 -21
  313. data/examples/sort/sort.rb +0 -23
  314. data/examples/sort/sort2.rb +0 -16
  315. data/examples/stats/mean.rb +0 -17
  316. data/examples/stats/statistics.rb +0 -18
  317. data/examples/stats/test.rb +0 -9
  318. data/examples/sum.rb +0 -34
  319. data/examples/tamu_anova.rb +0 -18
  320. data/examples/vector/a.dat +0 -0
  321. data/examples/vector/add.rb +0 -56
  322. data/examples/vector/b.dat +0 -4
  323. data/examples/vector/c.dat +0 -3
  324. data/examples/vector/collect.rb +0 -26
  325. data/examples/vector/compare.rb +0 -28
  326. data/examples/vector/complex.rb +0 -51
  327. data/examples/vector/complex_get_all.rb +0 -85
  328. data/examples/vector/complex_set_all.rb +0 -131
  329. data/examples/vector/complex_view_all.rb +0 -77
  330. data/examples/vector/connect.rb +0 -22
  331. data/examples/vector/decimate.rb +0 -38
  332. data/examples/vector/diff.rb +0 -31
  333. data/examples/vector/filescan.rb +0 -17
  334. data/examples/vector/floor.rb +0 -23
  335. data/examples/vector/get_all.rb +0 -82
  336. data/examples/vector/gnuplot.rb +0 -38
  337. data/examples/vector/graph.rb +0 -28
  338. data/examples/vector/histogram.rb +0 -22
  339. data/examples/vector/linspace.rb +0 -24
  340. data/examples/vector/log.rb +0 -17
  341. data/examples/vector/logic.rb +0 -33
  342. data/examples/vector/logspace.rb +0 -25
  343. data/examples/vector/minmax.rb +0 -47
  344. data/examples/vector/mul.rb +0 -49
  345. data/examples/vector/narray.rb +0 -46
  346. data/examples/vector/read.rb +0 -29
  347. data/examples/vector/set.rb +0 -35
  348. data/examples/vector/set_all.rb +0 -121
  349. data/examples/vector/smpv.dat +0 -15
  350. data/examples/vector/test.rb +0 -43
  351. data/examples/vector/test_gslblock.rb +0 -58
  352. data/examples/vector/vector.rb +0 -110
  353. data/examples/vector/view.rb +0 -35
  354. data/examples/vector/view_all.rb +0 -73
  355. data/examples/vector/where.rb +0 -29
  356. data/examples/vector/write.rb +0 -24
  357. data/examples/vector/zip.rb +0 -34
  358. data/examples/wavelet/ecg.dat +0 -256
  359. data/examples/wavelet/wavelet1.rb +0 -50
  360. data/ext/gsl_native/alf.c +0 -206
  361. data/ext/gsl_native/array.c +0 -553
  362. data/ext/gsl_native/array_complex.c +0 -245
  363. data/ext/gsl_native/blas.c +0 -28
  364. data/ext/gsl_native/blas1.c +0 -733
  365. data/ext/gsl_native/blas2.c +0 -1088
  366. data/ext/gsl_native/blas3.c +0 -880
  367. data/ext/gsl_native/block.c +0 -40
  368. data/ext/gsl_native/block_source.h +0 -885
  369. data/ext/gsl_native/bspline.c +0 -122
  370. data/ext/gsl_native/bundle.c +0 -3
  371. data/ext/gsl_native/cdf.c +0 -740
  372. data/ext/gsl_native/cheb.c +0 -531
  373. data/ext/gsl_native/combination.c +0 -275
  374. data/ext/gsl_native/common.c +0 -293
  375. data/ext/gsl_native/complex.c +0 -1002
  376. data/ext/gsl_native/const.c +0 -331
  377. data/ext/gsl_native/const_additional.c +0 -99
  378. data/ext/gsl_native/cqp.c +0 -283
  379. data/ext/gsl_native/deriv.c +0 -187
  380. data/ext/gsl_native/dht.c +0 -353
  381. data/ext/gsl_native/diff.c +0 -164
  382. data/ext/gsl_native/dirac.c +0 -388
  383. data/ext/gsl_native/eigen.c +0 -2322
  384. data/ext/gsl_native/error.c +0 -193
  385. data/ext/gsl_native/extconf.rb +0 -118
  386. data/ext/gsl_native/fft.c +0 -1095
  387. data/ext/gsl_native/fit.c +0 -204
  388. data/ext/gsl_native/fresnel.c +0 -312
  389. data/ext/gsl_native/function.c +0 -518
  390. data/ext/gsl_native/geometry.c +0 -139
  391. data/ext/gsl_native/graph.c +0 -1590
  392. data/ext/gsl_native/gsl.c +0 -259
  393. data/ext/gsl_native/gsl_narray.c +0 -794
  394. data/ext/gsl_native/histogram.c +0 -1964
  395. data/ext/gsl_native/histogram2d.c +0 -1042
  396. data/ext/gsl_native/histogram3d.c +0 -884
  397. data/ext/gsl_native/histogram3d_source.c +0 -749
  398. data/ext/gsl_native/histogram_find.c +0 -99
  399. data/ext/gsl_native/histogram_oper.c +0 -150
  400. data/ext/gsl_native/ieee.c +0 -88
  401. data/ext/gsl_native/include/rb_gsl.h +0 -136
  402. data/ext/gsl_native/include/rb_gsl_array.h +0 -214
  403. data/ext/gsl_native/include/rb_gsl_cheb.h +0 -19
  404. data/ext/gsl_native/include/rb_gsl_common.h +0 -348
  405. data/ext/gsl_native/include/rb_gsl_complex.h +0 -25
  406. data/ext/gsl_native/include/rb_gsl_const.h +0 -23
  407. data/ext/gsl_native/include/rb_gsl_dirac.h +0 -6
  408. data/ext/gsl_native/include/rb_gsl_eigen.h +0 -17
  409. data/ext/gsl_native/include/rb_gsl_fft.h +0 -49
  410. data/ext/gsl_native/include/rb_gsl_fit.h +0 -23
  411. data/ext/gsl_native/include/rb_gsl_function.h +0 -23
  412. data/ext/gsl_native/include/rb_gsl_graph.h +0 -68
  413. data/ext/gsl_native/include/rb_gsl_histogram.h +0 -63
  414. data/ext/gsl_native/include/rb_gsl_histogram3d.h +0 -97
  415. data/ext/gsl_native/include/rb_gsl_integration.h +0 -17
  416. data/ext/gsl_native/include/rb_gsl_interp.h +0 -41
  417. data/ext/gsl_native/include/rb_gsl_linalg.h +0 -21
  418. data/ext/gsl_native/include/rb_gsl_math.h +0 -20
  419. data/ext/gsl_native/include/rb_gsl_odeiv.h +0 -18
  420. data/ext/gsl_native/include/rb_gsl_poly.h +0 -67
  421. data/ext/gsl_native/include/rb_gsl_rational.h +0 -30
  422. data/ext/gsl_native/include/rb_gsl_rng.h +0 -20
  423. data/ext/gsl_native/include/rb_gsl_root.h +0 -22
  424. data/ext/gsl_native/include/rb_gsl_sf.h +0 -110
  425. data/ext/gsl_native/include/rb_gsl_statistics.h +0 -17
  426. data/ext/gsl_native/include/rb_gsl_tensor.h +0 -43
  427. data/ext/gsl_native/include/rb_gsl_with_narray.h +0 -31
  428. data/ext/gsl_native/include/templates_off.h +0 -87
  429. data/ext/gsl_native/include/templates_on.h +0 -241
  430. data/ext/gsl_native/integration.c +0 -1154
  431. data/ext/gsl_native/interp.c +0 -499
  432. data/ext/gsl_native/jacobi.c +0 -733
  433. data/ext/gsl_native/linalg.c +0 -3915
  434. data/ext/gsl_native/linalg_complex.c +0 -726
  435. data/ext/gsl_native/math.c +0 -706
  436. data/ext/gsl_native/matrix.c +0 -36
  437. data/ext/gsl_native/matrix_complex.c +0 -1733
  438. data/ext/gsl_native/matrix_double.c +0 -557
  439. data/ext/gsl_native/matrix_int.c +0 -255
  440. data/ext/gsl_native/matrix_source.h +0 -2708
  441. data/ext/gsl_native/min.c +0 -219
  442. data/ext/gsl_native/monte.c +0 -978
  443. data/ext/gsl_native/multifit.c +0 -1862
  444. data/ext/gsl_native/multimin.c +0 -778
  445. data/ext/gsl_native/multimin_fsdf.c +0 -156
  446. data/ext/gsl_native/multiroots.c +0 -952
  447. data/ext/gsl_native/multiset.c +0 -210
  448. data/ext/gsl_native/ndlinear.c +0 -320
  449. data/ext/gsl_native/nmf.c +0 -171
  450. data/ext/gsl_native/nmf_wrap.c +0 -75
  451. data/ext/gsl_native/ntuple.c +0 -469
  452. data/ext/gsl_native/odeiv.c +0 -947
  453. data/ext/gsl_native/ool.c +0 -879
  454. data/ext/gsl_native/permutation.c +0 -598
  455. data/ext/gsl_native/poly.c +0 -39
  456. data/ext/gsl_native/poly2.c +0 -265
  457. data/ext/gsl_native/poly_source.h +0 -1871
  458. data/ext/gsl_native/qrng.c +0 -160
  459. data/ext/gsl_native/randist.c +0 -1848
  460. data/ext/gsl_native/rational.c +0 -480
  461. data/ext/gsl_native/rng.c +0 -595
  462. data/ext/gsl_native/root.c +0 -407
  463. data/ext/gsl_native/sf.c +0 -1446
  464. data/ext/gsl_native/sf_airy.c +0 -200
  465. data/ext/gsl_native/sf_bessel.c +0 -871
  466. data/ext/gsl_native/sf_clausen.c +0 -28
  467. data/ext/gsl_native/sf_coulomb.c +0 -206
  468. data/ext/gsl_native/sf_coupling.c +0 -121
  469. data/ext/gsl_native/sf_dawson.c +0 -29
  470. data/ext/gsl_native/sf_debye.c +0 -148
  471. data/ext/gsl_native/sf_dilog.c +0 -43
  472. data/ext/gsl_native/sf_elementary.c +0 -46
  473. data/ext/gsl_native/sf_ellint.c +0 -206
  474. data/ext/gsl_native/sf_elljac.c +0 -30
  475. data/ext/gsl_native/sf_erfc.c +0 -89
  476. data/ext/gsl_native/sf_exp.c +0 -169
  477. data/ext/gsl_native/sf_expint.c +0 -201
  478. data/ext/gsl_native/sf_fermi_dirac.c +0 -148
  479. data/ext/gsl_native/sf_gamma.c +0 -343
  480. data/ext/gsl_native/sf_gegenbauer.c +0 -97
  481. data/ext/gsl_native/sf_hyperg.c +0 -203
  482. data/ext/gsl_native/sf_laguerre.c +0 -113
  483. data/ext/gsl_native/sf_lambert.c +0 -47
  484. data/ext/gsl_native/sf_legendre.c +0 -368
  485. data/ext/gsl_native/sf_log.c +0 -105
  486. data/ext/gsl_native/sf_mathieu.c +0 -235
  487. data/ext/gsl_native/sf_power.c +0 -47
  488. data/ext/gsl_native/sf_psi.c +0 -89
  489. data/ext/gsl_native/sf_synchrotron.c +0 -48
  490. data/ext/gsl_native/sf_transport.c +0 -76
  491. data/ext/gsl_native/sf_trigonometric.c +0 -210
  492. data/ext/gsl_native/sf_zeta.c +0 -115
  493. data/ext/gsl_native/signal.c +0 -303
  494. data/ext/gsl_native/siman.c +0 -713
  495. data/ext/gsl_native/sort.c +0 -207
  496. data/ext/gsl_native/spline.c +0 -377
  497. data/ext/gsl_native/stats.c +0 -787
  498. data/ext/gsl_native/sum.c +0 -168
  499. data/ext/gsl_native/tamu_anova.c +0 -56
  500. data/ext/gsl_native/tensor.c +0 -35
  501. data/ext/gsl_native/tensor_source.h +0 -1122
  502. data/ext/gsl_native/vector.c +0 -35
  503. data/ext/gsl_native/vector_complex.c +0 -2241
  504. data/ext/gsl_native/vector_double.c +0 -1433
  505. data/ext/gsl_native/vector_int.c +0 -202
  506. data/ext/gsl_native/vector_source.h +0 -3321
  507. data/ext/gsl_native/wavelet.c +0 -923
  508. data/lib/gsl.rb +0 -8
  509. data/lib/gsl/gnuplot.rb +0 -41
  510. data/lib/gsl/oper.rb +0 -43
  511. data/lib/gsl/version.rb +0 -3
  512. data/lib/ool.rb +0 -22
  513. data/lib/ool/conmin.rb +0 -30
  514. data/lib/rbgsl.rb +0 -1
  515. data/rdoc/alf.rdoc +0 -77
  516. data/rdoc/blas.rdoc +0 -269
  517. data/rdoc/bspline.rdoc +0 -42
  518. data/rdoc/changes.rdoc +0 -159
  519. data/rdoc/cheb.rdoc +0 -99
  520. data/rdoc/cholesky_complex.rdoc +0 -46
  521. data/rdoc/combi.rdoc +0 -125
  522. data/rdoc/complex.rdoc +0 -210
  523. data/rdoc/const.rdoc +0 -546
  524. data/rdoc/dht.rdoc +0 -122
  525. data/rdoc/diff.rdoc +0 -133
  526. data/rdoc/ehandling.rdoc +0 -50
  527. data/rdoc/eigen.rdoc +0 -401
  528. data/rdoc/fft.rdoc +0 -535
  529. data/rdoc/fit.rdoc +0 -284
  530. data/rdoc/function.rdoc +0 -94
  531. data/rdoc/graph.rdoc +0 -137
  532. data/rdoc/hist.rdoc +0 -409
  533. data/rdoc/hist2d.rdoc +0 -279
  534. data/rdoc/hist3d.rdoc +0 -112
  535. data/rdoc/integration.rdoc +0 -398
  536. data/rdoc/interp.rdoc +0 -231
  537. data/rdoc/intro.rdoc +0 -27
  538. data/rdoc/linalg.rdoc +0 -681
  539. data/rdoc/linalg_complex.rdoc +0 -88
  540. data/rdoc/math.rdoc +0 -276
  541. data/rdoc/matrix.rdoc +0 -1093
  542. data/rdoc/min.rdoc +0 -189
  543. data/rdoc/monte.rdoc +0 -234
  544. data/rdoc/multimin.rdoc +0 -312
  545. data/rdoc/multiroot.rdoc +0 -293
  546. data/rdoc/narray.rdoc +0 -177
  547. data/rdoc/ndlinear.rdoc +0 -250
  548. data/rdoc/nonlinearfit.rdoc +0 -348
  549. data/rdoc/ntuple.rdoc +0 -88
  550. data/rdoc/odeiv.rdoc +0 -378
  551. data/rdoc/perm.rdoc +0 -221
  552. data/rdoc/poly.rdoc +0 -335
  553. data/rdoc/qrng.rdoc +0 -90
  554. data/rdoc/randist.rdoc +0 -233
  555. data/rdoc/ref.rdoc +0 -93
  556. data/rdoc/rng.rdoc +0 -203
  557. data/rdoc/roots.rdoc +0 -305
  558. data/rdoc/sf.rdoc +0 -1622
  559. data/rdoc/siman.rdoc +0 -89
  560. data/rdoc/sort.rdoc +0 -94
  561. data/rdoc/start.rdoc +0 -16
  562. data/rdoc/stats.rdoc +0 -219
  563. data/rdoc/sum.rdoc +0 -65
  564. data/rdoc/tensor.rdoc +0 -251
  565. data/rdoc/tut.rdoc +0 -5
  566. data/rdoc/use.rdoc +0 -177
  567. data/rdoc/vector.rdoc +0 -1243
  568. data/rdoc/vector_complex.rdoc +0 -347
  569. data/rdoc/wavelet.rdoc +0 -218
  570. data/test/gsl/blas_test.rb +0 -79
  571. data/test/gsl/bspline_test.rb +0 -63
  572. data/test/gsl/cdf_test.rb +0 -1512
  573. data/test/gsl/cheb_test.rb +0 -80
  574. data/test/gsl/combination_test.rb +0 -100
  575. data/test/gsl/complex_test.rb +0 -20
  576. data/test/gsl/const_test.rb +0 -29
  577. data/test/gsl/deriv_test.rb +0 -62
  578. data/test/gsl/dht_test.rb +0 -79
  579. data/test/gsl/diff_test.rb +0 -53
  580. data/test/gsl/eigen_test.rb +0 -563
  581. data/test/gsl/err_test.rb +0 -23
  582. data/test/gsl/fit_test.rb +0 -101
  583. data/test/gsl/histo_test.rb +0 -14
  584. data/test/gsl/index_test.rb +0 -61
  585. data/test/gsl/integration_test.rb +0 -274
  586. data/test/gsl/interp_test.rb +0 -27
  587. data/test/gsl/linalg_test.rb +0 -463
  588. data/test/gsl/matrix_nmf_test.rb +0 -37
  589. data/test/gsl/matrix_test.rb +0 -98
  590. data/test/gsl/min_test.rb +0 -89
  591. data/test/gsl/monte_test.rb +0 -77
  592. data/test/gsl/multifit_test.rb +0 -753
  593. data/test/gsl/multimin_test.rb +0 -157
  594. data/test/gsl/multiroot_test.rb +0 -135
  595. data/test/gsl/multiset_test.rb +0 -52
  596. data/test/gsl/odeiv_test.rb +0 -275
  597. data/test/gsl/oper_test.rb +0 -98
  598. data/test/gsl/poly_test.rb +0 -338
  599. data/test/gsl/qrng_test.rb +0 -94
  600. data/test/gsl/quartic_test.rb +0 -28
  601. data/test/gsl/randist_test.rb +0 -122
  602. data/test/gsl/rng_test.rb +0 -303
  603. data/test/gsl/roots_test.rb +0 -78
  604. data/test/gsl/sf_test.rb +0 -2079
  605. data/test/gsl/stats_test.rb +0 -122
  606. data/test/gsl/sum_test.rb +0 -69
  607. data/test/gsl/tensor_test.rb +0 -396
  608. data/test/gsl/vector_test.rb +0 -223
  609. data/test/gsl/wavelet_test.rb +0 -130
  610. data/test/gsl_test.rb +0 -321
  611. data/test/test_helper.rb +0 -42
  612. data/uncrustify.cfg +0 -1693
@@ -1,3915 +0,0 @@
1
- /*
2
- linalg.c
3
- Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
- (C) Copyright 2001-2006 by Yoshiki Tsunesada
5
-
6
- Ruby/GSL is free software: you can redistribute it and/or modify it
7
- under the terms of the GNU General Public License.
8
- This library is distributed in the hope that it will be useful, but
9
- WITHOUT ANY WARRANTY.
10
- */
11
-
12
- #include <gsl/gsl_math.h>
13
- #include "include/rb_gsl_array.h"
14
- #include "include/rb_gsl_common.h"
15
- #include "include/rb_gsl_linalg.h"
16
-
17
- static VALUE cgsl_matrix_LU;
18
- static VALUE cgsl_matrix_QR;
19
- static VALUE cgsl_matrix_QRPT;
20
- static VALUE cgsl_vector_tau;
21
- static VALUE cgsl_matrix_Q;
22
- static VALUE cgsl_matrix_R;
23
-
24
- static VALUE cgsl_matrix_LQ;
25
- static VALUE cgsl_matrix_PTLQ;
26
- static VALUE cgsl_matrix_L;
27
-
28
- static VALUE cgsl_matrix_SV;
29
- static VALUE cgsl_matrix_U;
30
- static VALUE cgsl_matrix_V;
31
- static VALUE cgsl_vector_S;
32
- static VALUE cgsl_matrix_C;
33
-
34
- enum {
35
- LINALG_DECOMP,
36
- LINALG_DECOMP_BANG,
37
- };
38
-
39
- #ifdef HAVE_NARRAY_H
40
- static VALUE rb_gsl_linalg_LU_decomp_narray(int argc, VALUE *argv, VALUE obj,
41
- int flag)
42
- {
43
- struct NARRAY *na, *na2;
44
- VALUE m;
45
- gsl_matrix_view mv;
46
- gsl_permutation *p;
47
- int signum;
48
-
49
- if (argc != 1)
50
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
51
- GetNArray(argv[0], na);
52
- if (na->rank < 2) rb_raise(rb_eRuntimeError, "rank >= 2 required");
53
- if (na->shape[0] != na->shape[1])
54
- rb_raise(rb_eRuntimeError, "square matrix required");
55
- if (flag == LINALG_DECOMP) {
56
- m = na_make_object(NA_DFLOAT, 2, na->shape, CLASS_OF(argv[0]));
57
- GetNArray(m, na2);
58
- memcpy((double*)na2->ptr, (double*)na->ptr, sizeof(double)*na2->total);
59
- mv = gsl_matrix_view_array((double*)na2->ptr, na->shape[1], na->shape[0]);
60
- } else {
61
- mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
62
- }
63
- p = gsl_permutation_alloc(mv.matrix.size1);
64
- gsl_linalg_LU_decomp(&mv.matrix, p, &signum);
65
- if (flag == LINALG_DECOMP) {
66
- return rb_ary_new3(3, m,
67
- Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
68
- INT2FIX(signum));
69
- } else {
70
- return rb_ary_new3(3, argv[0],
71
- Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p),
72
- INT2FIX(signum));
73
- }
74
- }
75
- #endif
76
-
77
- static VALUE rb_gsl_linalg_LU_decomposition(int argc, VALUE *argv, VALUE obj, int flag)
78
- {
79
- gsl_matrix *mtmp = NULL, *m = NULL;
80
- gsl_permutation *p = NULL;
81
- int signum, itmp;
82
- size_t size;
83
- VALUE objp, objm, omatrix;
84
- switch (TYPE(obj)) {
85
- case T_MODULE: case T_CLASS: case T_OBJECT:
86
- #ifdef HAVE_NARRAY_H
87
- if (NA_IsNArray(argv[0]))
88
- return rb_gsl_linalg_LU_decomp_narray(argc, argv, obj, flag);
89
- #endif
90
- if (MATRIX_COMPLEX_P(argv[0]))
91
- return rb_gsl_linalg_complex_LU_decomp2(argc, argv, obj);
92
- omatrix = argv[0];
93
- itmp = 1;
94
- break;
95
- default:
96
- if (MATRIX_COMPLEX_P(obj))
97
- return rb_gsl_linalg_complex_LU_decomp2(argc, argv, obj);
98
- omatrix = obj;
99
- itmp = 0;
100
- break;
101
- }
102
- CHECK_MATRIX(omatrix);
103
- Data_Get_Struct(omatrix, gsl_matrix, mtmp);
104
- if (flag == LINALG_DECOMP_BANG) {
105
- m = mtmp;
106
- RBGSL_SET_CLASS(omatrix, cgsl_matrix_LU);
107
- objm = omatrix;
108
- } else {
109
- m = make_matrix_clone(mtmp);
110
- objm = Data_Wrap_Struct(cgsl_matrix_LU, 0, gsl_matrix_free, m);
111
- }
112
- size = m->size1;
113
- switch (argc-itmp) {
114
- case 0:
115
- p = gsl_permutation_alloc(size);
116
- gsl_linalg_LU_decomp(m, p, &signum);
117
- objp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
118
- if (flag == LINALG_DECOMP_BANG) return rb_ary_new3(2, objp, INT2FIX(signum));
119
- else return rb_ary_new3(3, objm, objp, INT2FIX(signum));
120
- break;
121
- case 1:
122
- CHECK_PERMUTATION(argv[itmp]);
123
- Data_Get_Struct(argv[itmp], gsl_permutation, p);
124
- gsl_linalg_LU_decomp(m, p, &signum);
125
- if (flag == LINALG_DECOMP_BANG) return INT2FIX(signum);
126
- else return rb_ary_new3(2, objm, INT2FIX(signum));
127
- break;
128
- default:
129
- rb_raise(rb_eArgError, "Usage: LU_decomp() or LU_decomp(permutation)");
130
- break;
131
- }
132
- return Qnil; /* never reach here */
133
- }
134
-
135
- static VALUE rb_gsl_linalg_LU_decomp(int argc, VALUE *argv, VALUE obj)
136
- {
137
- return rb_gsl_linalg_LU_decomposition(argc, argv, obj, LINALG_DECOMP);
138
- }
139
-
140
- static VALUE rb_gsl_linalg_LU_decomp_bang(int argc, VALUE *argv, VALUE obj)
141
- {
142
- return rb_gsl_linalg_LU_decomposition(argc, argv, obj, LINALG_DECOMP_BANG);
143
- }
144
-
145
- static gsl_matrix* get_matrix(VALUE obj, VALUE klass,int *flagm);
146
- static gsl_permutation* get_permutation(VALUE obj, size_t size, int *flagp);
147
- static gsl_vector* get_vector2(VALUE obj, int *flagv);
148
-
149
- static gsl_matrix* get_matrix(VALUE obj, VALUE klass, int *flagm)
150
- {
151
- gsl_matrix *mtmp = NULL, *m = NULL;
152
- if (CLASS_OF(obj) == klass) {
153
- Data_Get_Struct(obj, gsl_matrix, m);
154
- *flagm = 0;
155
- #ifdef HAVE_NARRAY_H
156
- } else if (NA_IsNArray(obj)) {
157
- gsl_matrix_view mv;
158
- struct NARRAY *na;
159
- GetNArray(obj, na);
160
- mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
161
- m = &mv.matrix;
162
- *flagm = -1;
163
- #endif
164
- } else {
165
- CHECK_MATRIX(obj);
166
- Data_Get_Struct(obj, gsl_matrix, mtmp);
167
- m = make_matrix_clone(mtmp);
168
- *flagm = 1;
169
- }
170
- return m;
171
- }
172
-
173
- static gsl_permutation* get_permutation(VALUE obj, size_t size, int *flagp)
174
- {
175
- gsl_permutation *p = NULL;
176
- if (CLASS_OF(obj) == cgsl_permutation) {
177
- Data_Get_Struct(obj, gsl_permutation, p);
178
- *flagp = 0;
179
- } else {
180
- p = gsl_permutation_alloc(size);
181
- *flagp = 1;
182
- }
183
- return p;
184
- }
185
-
186
- static gsl_vector* get_vector2(VALUE obj, int *flagv)
187
- {
188
- gsl_vector *v = NULL;
189
- if (TYPE(obj) == T_ARRAY) {
190
- v = make_cvector_from_rarray(obj);
191
- *flagv = 1;
192
- #ifdef HAVE_NARRAY_H
193
- } else if (NA_IsNArray(obj)) {
194
- gsl_vector_view vv;
195
- struct NARRAY *na;
196
- GetNArray(obj, na);
197
- vv = gsl_vector_view_array((double*) na->ptr, na->total);
198
- v = &vv.vector;
199
- *flagv = -1;
200
- #endif
201
- } else {
202
- CHECK_VECTOR(obj);
203
- Data_Get_Struct(obj, gsl_vector, v);
204
- *flagv = 0;
205
- }
206
- return v;
207
- }
208
-
209
- #ifdef HAVE_NARRAY_H
210
- static VALUE rb_gsl_linalg_LU_solve_narray(int argc, VALUE *argv, VALUE obj)
211
- {
212
- struct NARRAY *na, *b;
213
- VALUE ret;
214
- gsl_permutation *p;
215
- gsl_matrix_view mv;
216
- gsl_vector_view bv, xv;
217
- double *x;
218
- int shape[1];
219
- if (argc < 3)
220
- rb_raise(rb_eArgError,
221
- "wrong number of arguments %d(NArray, GSL::Permutation and NArray expected",
222
- argc);
223
- GetNArray(argv[0], na);
224
- mv = gsl_matrix_view_array((double*) na->ptr, na->shape[1], na->shape[0]);
225
- CHECK_PERMUTATION(argv[1]);
226
- Data_Get_Struct(argv[1], gsl_permutation, p);
227
- GetNArray(argv[2], b);
228
- bv = gsl_vector_view_array((double*) b->ptr, b->total);
229
- if (argc == 3) {
230
- shape[0] = b->total;
231
- ret = na_make_object(NA_DFLOAT, 1, shape, CLASS_OF(argv[0]));
232
- } else {
233
- ret = argv[3];
234
- }
235
- x = NA_PTR_TYPE(ret,double*);
236
- xv = gsl_vector_view_array(x, b->total);
237
- gsl_linalg_LU_solve(&mv.matrix, p, &bv.vector, &xv.vector);
238
- return ret;
239
- }
240
- #endif
241
-
242
- VALUE rb_gsl_linalg_LU_solve(int argc, VALUE *argv, VALUE obj)
243
- {
244
- gsl_matrix *m = NULL;
245
- gsl_permutation *p = NULL;
246
- gsl_vector *b = NULL, *x = NULL;
247
- int signum, flagm = 0, flagp = 0, flagb = 0, flagx = 0, itmp;
248
- size_t size;
249
- VALUE bb;
250
- switch (TYPE(obj)) {
251
- case T_MODULE: case T_CLASS: case T_OBJECT:
252
- if (argc < 2 || argc > 4)
253
- rb_raise(rb_eArgError, "Usage: solve(m, b), solve(m, b, x), solve(lu, p, b), solve(lu, p, b, x)");
254
- #ifdef HAVE_NARRAY_H
255
- if (NA_IsNArray(argv[0]))
256
- return rb_gsl_linalg_LU_solve_narray(argc, argv, obj);
257
- #endif
258
- m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
259
- itmp = 1;
260
- break;
261
- default:
262
- if (argc < 1 || argc > 3)
263
- rb_raise(rb_eArgError, "Usage: LU_solve(b), LU_solve(p, b), LU_solve(b, x), solve(p, b, x)");
264
- m = get_matrix(obj, cgsl_matrix_LU, &flagm);
265
- itmp = 0;
266
- break;
267
- }
268
- size = m->size1;
269
-
270
- p = get_permutation(argv[itmp], size, &flagp);
271
- if (flagp == 1 && flagm == 0) rb_raise(rb_eArgError, "permutation must be given");
272
- if (flagp == 0) itmp++;
273
- bb = argv[itmp];
274
- b = get_vector2(argv[itmp], &flagb);
275
- itmp++;
276
-
277
- if (itmp == argc) {
278
- x = gsl_vector_alloc(size);
279
- flagx = 1;
280
- } else {
281
- CHECK_VECTOR(argv[itmp]);
282
- Data_Get_Struct(argv[itmp], gsl_vector, x);
283
- }
284
- if (flagm == 1) gsl_linalg_LU_decomp(m, p, &signum);
285
- gsl_linalg_LU_solve(m, p, b, x);
286
- if (flagm == 1) gsl_matrix_free(m);
287
- if (flagp == 1) gsl_permutation_free(p);
288
- if (flagb == 1) gsl_vector_free(b);
289
- if (flagx == 1) return Data_Wrap_Struct(VECTOR_ROW_COL(bb), 0, gsl_vector_free, x);
290
- else return argv[argc-1];
291
- }
292
-
293
- #ifdef HAVE_NARRAY_H
294
- static VALUE rb_gsl_linalg_LU_svx_narray(int argc, VALUE *argv, VALUE obj)
295
- {
296
- struct NARRAY *na, *b;
297
- gsl_permutation *p;
298
- gsl_matrix_view mv;
299
- gsl_vector_view bv;
300
- if (argc != 3)
301
- rb_raise(rb_eArgError,
302
- "wrong number of arguments %d(NArray, GSL::Permutation and NArray expected",
303
- argc);
304
- GetNArray(argv[0], na);
305
- mv = gsl_matrix_view_array((double*) na->ptr, na->shape[1], na->shape[0]);
306
- CHECK_PERMUTATION(argv[1]);
307
- Data_Get_Struct(argv[1], gsl_permutation, p);
308
- GetNArray(argv[2], b);
309
- bv = gsl_vector_view_array((double*) b->ptr, b->total);
310
- gsl_linalg_LU_svx(&mv.matrix, p, &bv.vector);
311
- return argv[2];
312
- }
313
- #endif
314
-
315
- /* bb must be Vector, it is replaced by the root of the system */
316
- static VALUE rb_gsl_linalg_LU_svx(int argc, VALUE *argv, VALUE obj)
317
- {
318
- gsl_matrix *m = NULL;
319
- gsl_permutation *p = NULL;
320
- gsl_vector *b = NULL;
321
- int signum, flagm = 0, flagp = 0, flagb = 0, itmp;
322
- size_t size;
323
-
324
- switch (TYPE(obj)) {
325
- case T_MODULE: case T_CLASS: case T_OBJECT:
326
- if (argc < 2 || argc > 3)
327
- rb_raise(rb_eArgError, "Usage: svx(m, b), svx(lu, p, b)");
328
- #ifdef HAVE_NARRAY_H
329
- if (NA_IsNArray(argv[0]))
330
- return rb_gsl_linalg_LU_svx_narray(argc, argv, obj);
331
- #endif
332
- m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
333
- itmp = 1;
334
- break;
335
- default:
336
- if (argc < 1 || argc > 2)
337
- rb_raise(rb_eArgError, "Usage: LU_svx(b), LU_svx(p, b)");
338
- m = get_matrix(obj, cgsl_matrix_LU, &flagm);
339
- itmp = 0;
340
- break;
341
- }
342
- size = m->size1;
343
- p = get_permutation(argv[itmp], size, &flagp);
344
- if (flagp == 1 && flagm == 0) rb_raise(rb_eArgError, "permutation must be given");
345
- if (flagp == 0) itmp++;
346
- CHECK_VECTOR(argv[itmp]);
347
- b = get_vector2(argv[itmp], &flagb);
348
- if (flagm == 1) gsl_linalg_LU_decomp(m, p, &signum);
349
- gsl_linalg_LU_svx(m, p, b);
350
- if (flagm == 1) gsl_matrix_free(m);
351
- if (flagp == 1) gsl_permutation_free(p);
352
- return argv[itmp];
353
- }
354
-
355
- /* singleton */
356
- static VALUE rb_gsl_linalg_LU_refine(VALUE obj, VALUE vm,
357
- VALUE lu, VALUE pp, VALUE bb,
358
- VALUE xx)
359
- {
360
- gsl_matrix *m = NULL, *mlu = NULL;
361
- gsl_permutation *p = NULL;
362
- gsl_vector *b = NULL, *x = NULL, *r = NULL;
363
- int flagb = 0;
364
- VALUE vr;
365
- CHECK_MATRIX(vm); CHECK_MATRIX(lu);
366
- CHECK_PERMUTATION(pp); CHECK_VECTOR(xx);
367
- Data_Get_Struct(vm, gsl_matrix, m);
368
- Data_Get_Struct(lu, gsl_matrix, mlu);
369
- Data_Get_Struct(pp, gsl_permutation, p);
370
- if (TYPE(bb) == T_ARRAY) {
371
- b = make_cvector_from_rarray(bb);
372
- flagb = 1;
373
- } else {
374
- CHECK_VECTOR(bb);
375
- Data_Get_Struct(bb, gsl_vector, b);
376
- }
377
- Data_Get_Struct(xx, gsl_vector, x);
378
- r = gsl_vector_alloc(m->size1);
379
- gsl_linalg_LU_refine(m, mlu, p, b, x, r);
380
- vr = Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, r);
381
- if (flagb == 1) gsl_vector_free(b);
382
- return rb_ary_new3(2, xx, vr);
383
- }
384
-
385
- #ifdef HAVE_NARRAY_H
386
- static VALUE rb_gsl_linalg_LU_invert_narray(int argc, VALUE *argv, VALUE obj)
387
- {
388
- struct NARRAY *na;
389
- VALUE inv;
390
- gsl_permutation *p;
391
- gsl_matrix_view mv1, mv2;
392
- if (argc != 2) {
393
- rb_raise(rb_eArgError, "Usage: LU.invert(lu, perm)");
394
- }
395
- CHECK_PERMUTATION(argv[1]);
396
- GetNArray(argv[0], na);
397
- inv = na_make_object(NA_DFLOAT, 2, na->shape, CLASS_OF(argv[0]));
398
- mv1 = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
399
- mv2 = gsl_matrix_view_array(NA_PTR_TYPE(inv, double*), na->shape[1], na->shape[0]);
400
- CHECK_PERMUTATION(argv[1]);
401
- Data_Get_Struct(argv[1], gsl_permutation, p);
402
- gsl_linalg_LU_invert(&mv1.matrix, p, &mv2.matrix);
403
- return inv;
404
- }
405
- static VALUE rb_gsl_linalg_LU_det_narray(int argc, VALUE *argv, VALUE obj)
406
- {
407
- struct NARRAY *na;
408
- gsl_matrix_view mv;
409
- int signum = 1;
410
- switch (argc) {
411
- case 2:
412
- signum = FIX2INT(argv[1]);
413
- /* no break */
414
- case 1:
415
- GetNArray(argv[0], na);
416
- mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
417
- break;
418
- default:
419
- rb_raise(rb_eArgError, "Usage: LU.det(lu, perm)");
420
- break;
421
- }
422
- return rb_float_new(gsl_linalg_LU_det(&mv.matrix, signum));
423
- }
424
- static VALUE rb_gsl_linalg_LU_lndet_narray(int argc, VALUE *argv, VALUE obj)
425
- {
426
- struct NARRAY *na;
427
- gsl_matrix_view mv;
428
- switch (argc) {
429
- case 1:
430
- GetNArray(argv[0], na);
431
- mv = gsl_matrix_view_array((double*)na->ptr, na->shape[1], na->shape[0]);
432
- break;
433
- default:
434
- rb_raise(rb_eArgError, "Usage: LU.lndet(lu)");
435
- break;
436
- }
437
- return rb_float_new(gsl_linalg_LU_lndet(&mv.matrix));
438
- }
439
-
440
- #endif
441
-
442
- static VALUE rb_gsl_linalg_LU_invert(int argc, VALUE *argv, VALUE obj)
443
- {
444
- gsl_matrix *m = NULL, *inverse = NULL;
445
- gsl_permutation *p = NULL;
446
- int signum, flagm = 0, flagp = 0, itmp;
447
- size_t size;
448
- switch (TYPE(obj)) {
449
- case T_MODULE: case T_CLASS: case T_OBJECT:
450
- #ifdef HAVE_NARRAY_H
451
- if (NA_IsNArray(argv[0]))
452
- return rb_gsl_linalg_LU_invert_narray(argc, argv, obj);
453
- #endif
454
- m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
455
- itmp = 1;
456
- break;
457
- default:
458
- m = get_matrix(obj, cgsl_matrix_LU, &flagm);
459
- itmp = 0;
460
- }
461
- size = m->size1;
462
-
463
- if (argc == itmp) {
464
- p = gsl_permutation_alloc(size);
465
- flagp = 1;
466
- } else {
467
- CHECK_PERMUTATION(argv[itmp]);
468
- p = get_permutation(argv[itmp], size, &flagp);
469
- }
470
- if (flagp == 1 && flagm == 0) rb_raise(rb_eArgError, "permutation must be given");
471
- if (flagp == 0) itmp++;
472
- if (flagm == 1 || flagp == 1) {
473
- gsl_linalg_LU_decomp(m, p, &signum);
474
- }
475
- if (argc-1 == itmp) {
476
- CHECK_MATRIX(argv[itmp]);
477
- Data_Get_Struct(argv[itmp], gsl_matrix, inverse);
478
- } else {
479
- inverse = gsl_matrix_alloc(size, size);
480
- }
481
- gsl_linalg_LU_invert(m, p, inverse);
482
- if (flagm == 1) gsl_matrix_free(m);
483
- if (flagp == 1) gsl_permutation_free(p);
484
- if (argc-1 == itmp) return argv[itmp];
485
- else return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, inverse);
486
- }
487
- static VALUE rb_gsl_linalg_LU_det(int argc, VALUE *argv, VALUE obj)
488
- {
489
- gsl_matrix *m = NULL;
490
- gsl_permutation *p = NULL;
491
- int flagm = 0, flagp = 0, itmp, sign;
492
- size_t size;
493
- double det;
494
- switch (TYPE(obj)) {
495
- case T_MODULE: case T_CLASS: case T_OBJECT:
496
- if (argc < 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
497
- argc);
498
- #ifdef HAVE_NARRAY_H
499
- if (NA_IsNArray(argv[0]))
500
- return rb_gsl_linalg_LU_det_narray(argc, argv, obj);
501
- #endif
502
-
503
- m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
504
- itmp = 1;
505
- break;
506
- default:
507
- m = get_matrix(obj, cgsl_matrix_LU, &flagm);
508
- itmp = 0;
509
- break;
510
- }
511
- size = m->size1;
512
- if (flagm == 0) {
513
- if (argc-itmp == 1) sign = FIX2INT(argv[itmp]);
514
- else sign = 1;
515
- } else {
516
- if (argc-itmp >= 2) {
517
- get_permutation(argv[itmp], size, &flagp);
518
- } else {
519
- p = gsl_permutation_alloc(size);
520
- flagp = 1;
521
- }
522
- }
523
- if (flagm == 1) gsl_linalg_LU_decomp(m, p, &sign);
524
- det = gsl_linalg_LU_det(m, sign);
525
- if (flagm == 1) gsl_matrix_free(m);
526
- if (flagp == 1) gsl_permutation_free(p);
527
- return rb_float_new(det);
528
- }
529
-
530
- static VALUE rb_gsl_linalg_LU_lndet(int argc, VALUE *argv, VALUE obj)
531
- {
532
- gsl_matrix *m = NULL;
533
- gsl_permutation *p = NULL;
534
- int flagm = 0, sign;
535
- double lndet;
536
-
537
- switch (TYPE(obj)) {
538
- case T_MODULE: case T_CLASS: case T_OBJECT:
539
- if (argc < 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
540
- argc);
541
- #ifdef HAVE_NARRAY_H
542
- if (NA_IsNArray(argv[0]))
543
- return rb_gsl_linalg_LU_lndet_narray(argc, argv, obj);
544
- #endif
545
-
546
- m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
547
- break;
548
- default:
549
- m = get_matrix(obj, cgsl_matrix_LU, &flagm);
550
- break;
551
- }
552
- if (flagm == 1) {
553
- p = gsl_permutation_alloc(m->size1);
554
- gsl_linalg_LU_decomp(m, p, &sign);
555
- }
556
- lndet = gsl_linalg_LU_lndet(m);
557
- if (flagm == 1) {
558
- gsl_matrix_free(m);
559
- gsl_permutation_free(p);
560
- }
561
- return rb_float_new(lndet);
562
- }
563
-
564
- static VALUE rb_gsl_linalg_LU_sgndet(int argc, VALUE *argv, VALUE obj)
565
- {
566
- gsl_matrix *m = NULL;
567
- gsl_permutation *p = NULL;
568
- int flagm = 0, sign, signdet, itmp;
569
- switch (TYPE(obj)) {
570
- case T_MODULE: case T_CLASS: case T_OBJECT:
571
- m = get_matrix(argv[0], cgsl_matrix_LU, &flagm);
572
- itmp = 1;
573
- break;
574
- default:
575
- m = get_matrix(obj, cgsl_matrix_LU, &flagm);
576
- itmp = 0;
577
- break;
578
- }
579
- if (flagm == 1) {
580
- p = gsl_permutation_alloc(m->size1);
581
- gsl_linalg_LU_decomp(m, p, &sign);
582
- } else {
583
- if (argc-itmp != 1) rb_raise(rb_eArgError, "sign must be given");
584
- sign = FIX2INT(argv[itmp]);
585
- }
586
- signdet = gsl_linalg_LU_sgndet(m, sign);
587
- if (flagm == 1) {
588
- gsl_matrix_free(m);
589
- gsl_permutation_free(p);
590
- }
591
- return INT2FIX(signdet);
592
- }
593
-
594
- int gsl_linalg_LQ_solve_T(const gsl_matrix*, const gsl_vector*, const gsl_vector*, gsl_vector*);
595
- int gsl_linalg_LQ_svx_T (const gsl_matrix*, const gsl_vector*, gsl_vector*);
596
- int gsl_linalg_LQ_lssolve_T(const gsl_matrix * LQ, const gsl_vector * tau,
597
- const gsl_vector * b, gsl_vector * x,
598
- gsl_vector * residual);
599
- int
600
- gsl_linalg_LQ_Lsolve_T (const gsl_matrix * LQ, const gsl_vector * b, gsl_vector* x);
601
- int
602
- gsl_linalg_LQ_Lsvx_T (const gsl_matrix * LQ, gsl_vector * x);
603
- int
604
- gsl_linalg_L_solve_T (const gsl_matrix * L, const gsl_vector * b, gsl_vector * x);
605
-
606
- enum {
607
- LINALG_QR_DECOMP,
608
- LINALG_QR_DECOMP_BANG,
609
- LINALG_LQ_DECOMP,
610
- LINALG_LQ_DECOMP_BANG,
611
- LINALG_QR_SOLVE,
612
- LINALG_LQ_SOLVE,
613
- LINALG_QR_QTvec,
614
- LINALG_QR_Qvec,
615
- LINALG_LQ_vecQ,
616
- LINALG_LQ_vecQT,
617
- LINALG_QR_RSOLVE,
618
- LINALG_LQ_LSOLVE,
619
- LINALG_QR_RSVX,
620
- LINALG_LQ_LSVX,
621
- LINALG_R_SOLVE,
622
- LINALG_R_SVX,
623
- LINALG_L_SOLVE,
624
- LINALG_L_SVX,
625
- LINALG_QR_UNPACK,
626
- LINALG_LQ_UNPACK,
627
- };
628
-
629
- static VALUE rb_gsl_linalg_QR_LQ_decomposition(int argc, VALUE *argv, VALUE obj,
630
- int flag)
631
- {
632
- gsl_matrix *m = NULL, *mtmp = NULL;
633
- gsl_vector *tau = NULL;
634
- int (*fdecomp)(gsl_matrix *, gsl_vector *);
635
- int itmp, status;
636
- VALUE vtau, mdecomp, omatrix;
637
-
638
- switch (TYPE(obj)) {
639
- case T_MODULE: case T_CLASS: case T_OBJECT:
640
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
641
- omatrix = argv[0];
642
- itmp = 1;
643
- break;
644
- default:
645
- omatrix = obj;
646
- itmp = 0;
647
- break;
648
- }
649
- CHECK_MATRIX(omatrix);
650
- Data_Get_Struct(omatrix, gsl_matrix, mtmp);
651
-
652
- switch (flag) {
653
- case LINALG_QR_DECOMP:
654
- fdecomp = &gsl_linalg_QR_decomp;
655
- m = make_matrix_clone(mtmp);
656
- mdecomp = Data_Wrap_Struct(cgsl_matrix_QR, 0, gsl_matrix_free, m);
657
- break;
658
- case LINALG_QR_DECOMP_BANG:
659
- fdecomp = &gsl_linalg_QR_decomp;
660
- m = mtmp;
661
- mdecomp = omatrix;
662
- RBGSL_SET_CLASS(mdecomp, cgsl_matrix_QR);
663
- break;
664
- case LINALG_LQ_DECOMP:
665
- fdecomp = &gsl_linalg_LQ_decomp;
666
- m = make_matrix_clone(mtmp);
667
- mdecomp = Data_Wrap_Struct(cgsl_matrix_LQ, 0, gsl_matrix_free, m);
668
- break;
669
- case LINALG_LQ_DECOMP_BANG:
670
- fdecomp = &gsl_linalg_LQ_decomp;
671
- m = mtmp;
672
- mdecomp = omatrix;
673
- RBGSL_SET_CLASS(mdecomp, cgsl_matrix_LQ);
674
- break;
675
- default:
676
- rb_raise(rb_eRuntimeError, "unknown operation");
677
- break;
678
- }
679
- switch (argc - itmp) {
680
- case 0:
681
- tau = gsl_vector_alloc(GSL_MIN(mtmp->size1, mtmp->size2));
682
- break;
683
- case 1:
684
- CHECK_VECTOR(argv[itmp]);
685
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
686
- break;
687
- default:
688
- rb_raise(rb_eArgError, "wrong number of arguments");
689
- break;
690
- }
691
- status = (*fdecomp)(m, tau);
692
- switch (flag) {
693
- case LINALG_QR_DECOMP:
694
- case LINALG_LQ_DECOMP:
695
- if (argc == itmp) {
696
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
697
- return rb_ary_new3(2, mdecomp, vtau);
698
- } else {
699
- RBGSL_SET_CLASS(argv[itmp], cgsl_vector_tau);
700
- return mdecomp;
701
- }
702
- break;
703
- case LINALG_QR_DECOMP_BANG:
704
- case LINALG_LQ_DECOMP_BANG:
705
- if (argc == itmp) {
706
- return Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
707
- } else {
708
- RBGSL_SET_CLASS(argv[itmp], cgsl_vector_tau);
709
- return INT2FIX(status);
710
- }
711
- break;
712
- default:
713
- rb_raise(rb_eRuntimeError, "unknown operation");
714
- break;
715
- }
716
- return Qnil;
717
- }
718
-
719
- #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
- static VALUE rb_gsl_linalg_QR_unpack_narray(int argc, VALUE *argv, VALUE obj)
742
- {
743
- struct NARRAY *m, *tau;
744
- gsl_matrix_view mv, mq, mr;
745
- gsl_vector_view vv;
746
- int shape[2];
747
- VALUE q, r;
748
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
749
- argc);
750
- GetNArray(argv[0], m);
751
- GetNArray(argv[1], tau);
752
- mv = gsl_matrix_view_array((double*)m->ptr, m->shape[1], m->shape[0]);
753
- vv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
754
- shape[0] = m->shape[1];
755
- shape[1] = m->shape[1];
756
- q = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
757
- shape[0] = m->shape[1];
758
- shape[1] = m->shape[0];
759
- r = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
760
- mq = gsl_matrix_view_array(NA_PTR_TYPE(q,double*), m->shape[1], m->shape[1]);
761
- mr = gsl_matrix_view_array(NA_PTR_TYPE(r,double*), m->shape[1], m->shape[0]);
762
- // printf("OK 4 %d %d\n", mq.matrix.size1, mr.matrix.size2);
763
- gsl_linalg_QR_unpack(&mv.matrix, &vv.vector, &mq.matrix, &mr.matrix);
764
- // printf("OK 5\n");
765
- return rb_ary_new3(2, q, r);
766
- }
767
-
768
- static VALUE rb_gsl_linalg_QR_solve_narray(int argc, VALUE *argv, VALUE obj)
769
- {
770
- struct NARRAY *qr, *tau, *b;
771
- VALUE x;
772
- gsl_matrix_view mv;
773
- gsl_vector_view tv, bv, xv;
774
- if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
775
- GetNArray(argv[0], qr);
776
- GetNArray(argv[1], tau);
777
- GetNArray(argv[2], b);
778
- x = na_make_object(NA_DFLOAT, 1, b->shape, CLASS_OF(argv[2]));
779
- mv = gsl_matrix_view_array((double*)qr->ptr, qr->shape[1], qr->shape[0]);
780
- tv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
781
- bv = gsl_vector_view_array((double*)b->ptr, b->shape[0]);
782
- xv = gsl_vector_view_array(NA_PTR_TYPE(x,double*), b->shape[0]);
783
- gsl_linalg_QR_solve(&mv.matrix, &tv.vector, &bv.vector, &xv.vector);
784
- return x;
785
- }
786
- static VALUE rb_gsl_linalg_QR_svx_narray(int argc, VALUE *argv, VALUE obj)
787
- {
788
- struct NARRAY *qr, *tau, *b;
789
- gsl_matrix_view mv;
790
- gsl_vector_view tv, bv;
791
- if (argc != 3) rb_raise(rb_eArgError, "Usage: QR.solve(qr, tau, b)");
792
- GetNArray(argv[0], qr);
793
- GetNArray(argv[1], tau);
794
- GetNArray(argv[2], b);
795
- mv = gsl_matrix_view_array((double*)qr->ptr, qr->shape[1], qr->shape[0]);
796
- tv = gsl_vector_view_array((double*)tau->ptr, tau->shape[0]);
797
- bv = gsl_vector_view_array((double*)b->ptr, b->shape[0]);
798
- gsl_linalg_QR_svx(&mv.matrix, &tv.vector, &bv.vector);
799
- return argv[2];
800
- }
801
-
802
- #endif
803
-
804
- static VALUE rb_gsl_linalg_QR_decomp(int argc, VALUE *argv, VALUE obj)
805
- {
806
- #ifdef HAVE_NARRAY_H
807
- if (argc >= 1 && NA_IsNArray(argv[0]))
808
- return rb_gsl_linalg_QR_decomp_narray(argc, argv, obj);
809
- #endif
810
- return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_QR_DECOMP);
811
- }
812
-
813
- static VALUE rb_gsl_linalg_QR_decomp_bang(int argc, VALUE *argv, VALUE obj)
814
- {
815
- return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_QR_DECOMP_BANG);
816
- }
817
-
818
- static VALUE rb_gsl_linalg_LQ_decomp(int argc, VALUE *argv, VALUE obj)
819
- {
820
- return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_LQ_DECOMP);
821
- }
822
-
823
- static VALUE rb_gsl_linalg_LQ_decomp_bang(int argc, VALUE *argv, VALUE obj)
824
- {
825
- return rb_gsl_linalg_QR_LQ_decomposition(argc, argv, obj, LINALG_LQ_DECOMP_BANG);
826
- }
827
-
828
- static VALUE rb_gsl_linalg_QR_LQ_solve(int argc, VALUE *argv, VALUE obj, int flag)
829
- {
830
- gsl_matrix *m = NULL;
831
- gsl_vector *b = NULL, *x = NULL, *tau = NULL;
832
- VALUE omatrix;
833
- int flagm = 0, flagt = 0, flagb = 0, flagx = 0, itmp;
834
- size_t size;
835
- int (*fdecomp)(gsl_matrix*, gsl_vector*);
836
- int (*fsolve)(const gsl_matrix*, const gsl_vector*, const gsl_vector*, gsl_vector*);
837
-
838
- switch (TYPE(obj)) {
839
- case T_MODULE: case T_CLASS: case T_OBJECT:
840
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
841
- omatrix = argv[0];
842
- itmp = 1;
843
- break;
844
- default:
845
- omatrix = obj;
846
- itmp = 0;
847
- break;
848
- }
849
- if (argc-itmp < 1 || argc-itmp > 3)
850
- rb_raise(rb_eArgError, "wrong number of arguments");
851
- CHECK_MATRIX(omatrix);
852
- switch (flag) {
853
- case LINALG_QR_SOLVE:
854
- m = get_matrix(omatrix, cgsl_matrix_QR, &flagm);
855
- fdecomp = &gsl_linalg_QR_decomp;
856
- fsolve = &gsl_linalg_QR_solve;
857
- break;
858
- case LINALG_LQ_SOLVE:
859
- m = get_matrix(omatrix, cgsl_matrix_LQ, &flagm);
860
- fdecomp = &gsl_linalg_LQ_decomp;
861
- fsolve = &gsl_linalg_LQ_solve_T;
862
- break;
863
- default:
864
- rb_raise(rb_eRuntimeError, "unknown operatioin");
865
- break;
866
- }
867
- size = m->size1;
868
- if (flagm == 0) { /* the matrix given is already decomped */
869
- if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
870
- rb_raise(rb_eArgError, "tau vector must be given");
871
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
872
- flagt = 0;
873
- itmp++;
874
- } else {
875
- if (CLASS_OF(argv[itmp]) == cgsl_vector_tau) {
876
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
877
- flagt = 0;
878
- itmp++;
879
- } else {
880
- tau = gsl_vector_alloc(size);
881
- flagt = 1;
882
- }
883
- }
884
- b = get_vector2(argv[itmp], &flagb);
885
- itmp++;
886
- if (itmp == argc) {
887
- x = gsl_vector_alloc(m->size1);
888
- flagx = 1;
889
- } else {
890
- CHECK_VECTOR(argv[itmp]);
891
- Data_Get_Struct(argv[itmp], gsl_vector, x);
892
- flagx = 0;
893
- }
894
- if (flagm == 1) (*fdecomp)(m, tau);
895
- (*fsolve)(m, tau, b, x);
896
- if (flagm == 1) gsl_matrix_free(m);
897
- if (flagt == 1) gsl_vector_free(tau);
898
- if (flagb == 1) gsl_vector_free(b);
899
- if (flagx == 1) return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
900
- else return argv[itmp];
901
- }
902
-
903
- static VALUE rb_gsl_linalg_QR_LQ_svx(int argc, VALUE *argv, VALUE obj, int flag)
904
- {
905
- gsl_matrix *m = NULL;
906
- gsl_vector *b = NULL, *tau = NULL;
907
- VALUE omatrix;
908
- int flagm = 0, flagt = 0, flagb = 0, itmp;
909
- size_t size;
910
- int (*fdecomp)(gsl_matrix*, gsl_vector*);
911
- int (*fsvx)(const gsl_matrix*, const gsl_vector*, gsl_vector*);
912
-
913
- switch (TYPE(obj)) {
914
- case T_MODULE: case T_CLASS: case T_OBJECT:
915
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
916
- omatrix = argv[0];
917
- itmp = 1;
918
- break;
919
- default:
920
- omatrix = obj;
921
- itmp = 0;
922
- break;
923
- }
924
- if (argc-itmp < 1 || argc-itmp > 2)
925
- rb_raise(rb_eArgError, "wrong number of arguments");
926
- CHECK_MATRIX(omatrix);
927
- switch (flag) {
928
- case LINALG_QR_SOLVE:
929
- m = get_matrix(omatrix, cgsl_matrix_QR, &flagm);
930
- fdecomp = &gsl_linalg_QR_decomp;
931
- fsvx = &gsl_linalg_QR_svx;
932
- break;
933
- case LINALG_LQ_SOLVE:
934
- m = get_matrix(omatrix, cgsl_matrix_LQ, &flagm);
935
- fdecomp = &gsl_linalg_LQ_decomp;
936
- fsvx = &gsl_linalg_LQ_svx_T;
937
- break;
938
- default:
939
- rb_raise(rb_eRuntimeError, "unknown operatioin");
940
- break;
941
- }
942
- size = m->size1;
943
- if (flagm == 0) { /* the matrix given is already decomped */
944
- if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
945
- rb_raise(rb_eArgError, "tau vector must be given");
946
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
947
- flagt = 0;
948
- itmp++;
949
- } else {
950
- if (CLASS_OF(argv[itmp]) == cgsl_vector_tau) {
951
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
952
- flagt = 0;
953
- itmp++;
954
- } else {
955
- tau = gsl_vector_alloc(size);
956
- flagt = 1;
957
- }
958
- }
959
- b = get_vector2(argv[itmp], &flagb);
960
- if (flagm == 1 && flagt == 1) (*fdecomp)(m, tau);
961
- (*fsvx)(m, tau, b);
962
- if (flagm == 1) gsl_matrix_free(m);
963
- if (flagt == 1) gsl_vector_free(tau);
964
- return argv[itmp];
965
- }
966
-
967
- static VALUE rb_gsl_linalg_QR_LQ_lssolve(int argc, VALUE *argv, VALUE obj, int flag)
968
- {
969
- gsl_matrix *m = NULL;
970
- gsl_vector *b = NULL, *x = NULL, *tau = NULL, *r = NULL;
971
- VALUE omatrix;
972
- int flagm = 0, flagt = 0, flagb = 0, itmp, status;
973
- size_t size;
974
- int (*fdecomp)(gsl_matrix*, gsl_vector*);
975
- int (*flssolve)(const gsl_matrix*, const gsl_vector*, const gsl_vector*, gsl_vector*,
976
- gsl_vector*);
977
-
978
- switch (TYPE(obj)) {
979
- case T_MODULE: case T_CLASS: case T_OBJECT:
980
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
981
- omatrix = argv[0];
982
- itmp = 1;
983
- break;
984
- default:
985
- omatrix = obj;
986
- itmp = 0;
987
- break;
988
- }
989
- if (argc-itmp < 1 || argc-itmp > 4)
990
- rb_raise(rb_eArgError, "wrong number of arguments");
991
- CHECK_MATRIX(omatrix);
992
- switch (flag) {
993
- case LINALG_QR_SOLVE:
994
- m = get_matrix(omatrix, cgsl_matrix_QR, &flagm);
995
- fdecomp = &gsl_linalg_QR_decomp;
996
- flssolve = &gsl_linalg_QR_lssolve;
997
- break;
998
- case LINALG_LQ_SOLVE:
999
- m = get_matrix(omatrix, cgsl_matrix_LQ, &flagm);
1000
- fdecomp = &gsl_linalg_LQ_decomp;
1001
- flssolve = &gsl_linalg_LQ_lssolve_T;
1002
- break;
1003
- default:
1004
- rb_raise(rb_eRuntimeError, "unknown operatioin");
1005
- break;
1006
- }
1007
- size = m->size1;
1008
- if (flagm == 0) { /* the matrix given is already decomped */
1009
- if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
1010
- rb_raise(rb_eArgError, "tau vector must be given");
1011
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
1012
- flagt = 0;
1013
- itmp++;
1014
- } else {
1015
- if (CLASS_OF(argv[itmp]) == cgsl_vector_tau) {
1016
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
1017
- flagt = 0;
1018
- itmp++;
1019
- } else {
1020
- tau = gsl_vector_alloc(size);
1021
- flagt = 1;
1022
- }
1023
- }
1024
- b = get_vector2(argv[itmp], &flagb);
1025
- itmp++;
1026
- switch (argc - itmp) {
1027
- case 2:
1028
- CHECK_VECTOR(argv[argc-2]);
1029
- Data_Get_Struct(argv[argc-2], gsl_vector, x);
1030
- CHECK_VECTOR(argv[argc-1]);
1031
- Data_Get_Struct(argv[argc-1], gsl_vector, r);
1032
- break;
1033
- case 1:
1034
- CHECK_VECTOR(argv[argc-1]);
1035
- Data_Get_Struct(argv[argc-1], gsl_vector, x);
1036
- r = gsl_vector_alloc(x->size);
1037
- break;
1038
- case 0:
1039
- x = gsl_vector_alloc(m->size1);
1040
- r = gsl_vector_alloc(m->size1);
1041
- break;
1042
- default:
1043
- rb_raise(rb_eArgError, "wrong number of arguments");
1044
- break;
1045
- }
1046
- if (flagm == 1) (*fdecomp)(m, tau);
1047
- status = (*flssolve)(m, tau, b, x, r);
1048
- if (flagm == 1) gsl_matrix_free(m);
1049
- if (flagt == 1) gsl_vector_free(tau);
1050
- if (flagb == 1) gsl_vector_free(b);
1051
- switch (argc - itmp) {
1052
- case 2:
1053
- return INT2FIX(status);
1054
- break;
1055
- case 1:
1056
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, r);
1057
- break;
1058
- default:
1059
- return rb_ary_new3(2, Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x),
1060
- Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, r));
1061
- }
1062
- return Qnil;
1063
- }
1064
-
1065
- static VALUE rb_gsl_linalg_QR_solve(int argc, VALUE *argv, VALUE obj)
1066
- {
1067
- #ifdef HAVE_NARRAY_H
1068
- if (argc == 3 && NA_IsNArray(argv[0]))
1069
- return rb_gsl_linalg_QR_solve_narray(argc, argv, obj);
1070
- #endif
1071
- return rb_gsl_linalg_QR_LQ_solve(argc, argv, obj, LINALG_QR_SOLVE);
1072
- }
1073
-
1074
- static VALUE rb_gsl_linalg_QR_svx(int argc, VALUE *argv, VALUE obj)
1075
- {
1076
- #ifdef HAVE_NARRAY_H
1077
- if (argc == 2 && NA_IsNArray(argv[0]))
1078
- return rb_gsl_linalg_QR_svx_narray(argc, argv, obj);
1079
- #endif
1080
- return rb_gsl_linalg_QR_LQ_svx(argc, argv, obj, LINALG_QR_SOLVE);
1081
- }
1082
-
1083
- static VALUE rb_gsl_linalg_QR_lssolve(int argc, VALUE *argv, VALUE obj)
1084
- {
1085
- return rb_gsl_linalg_QR_LQ_lssolve(argc, argv, obj, LINALG_QR_SOLVE);
1086
- }
1087
-
1088
- static VALUE rb_gsl_linalg_LQ_solve(int argc, VALUE *argv, VALUE obj)
1089
- {
1090
- return rb_gsl_linalg_QR_LQ_solve(argc, argv, obj, LINALG_LQ_SOLVE);
1091
- }
1092
-
1093
- static VALUE rb_gsl_linalg_LQ_svx(int argc, VALUE *argv, VALUE obj)
1094
- {
1095
- return rb_gsl_linalg_QR_LQ_svx(argc, argv, obj, LINALG_LQ_SOLVE);
1096
- }
1097
-
1098
- static VALUE rb_gsl_linalg_LQ_lssolve(int argc, VALUE *argv, VALUE obj)
1099
- {
1100
- return rb_gsl_linalg_QR_LQ_lssolve(argc, argv, obj, LINALG_LQ_SOLVE);
1101
- }
1102
-
1103
- static VALUE rb_gsl_linalg_QRLQ_QTvec(int argc, VALUE *argv, VALUE obj,
1104
- int flag)
1105
- {
1106
- gsl_matrix *QR = NULL;
1107
- gsl_vector *tau = NULL, *v = NULL;
1108
- VALUE ret;
1109
- switch (TYPE(obj)) {
1110
- case T_MODULE: case T_CLASS: case T_OBJECT:
1111
- if (argc != 3) rb_raise(rb_eArgError,
1112
- "wrong number of arguments (%d for 3)", argc);
1113
- CHECK_MATRIX(argv[0]); CHECK_VECTOR(argv[1]); CHECK_VECTOR(argv[2]);
1114
- Data_Get_Struct(argv[0], gsl_matrix, QR);
1115
- Data_Get_Struct(argv[1], gsl_vector, tau);
1116
- Data_Get_Struct(argv[2], gsl_vector, v);
1117
- ret = argv[2];
1118
- break;
1119
- default:
1120
- if (argc != 2) rb_raise(rb_eArgError,
1121
- "wrong number of arguments (%d for 2)", argc);
1122
- CHECK_VECTOR(argv[2]); CHECK_VECTOR(argv[1]);
1123
- Data_Get_Struct(obj, gsl_matrix, QR);
1124
- Data_Get_Struct(argv[0], gsl_vector, tau);
1125
- Data_Get_Struct(argv[1], gsl_vector, v);
1126
- ret = argv[1];
1127
- break;
1128
- }
1129
- switch (flag) {
1130
- case LINALG_QR_QTvec:
1131
- gsl_linalg_QR_QTvec(QR, tau, v);
1132
- break;
1133
- case LINALG_QR_Qvec:
1134
- gsl_linalg_QR_Qvec(QR, tau, v);
1135
- break;
1136
- case LINALG_LQ_vecQ:
1137
- gsl_linalg_LQ_vecQ(QR, tau, v);
1138
- break;
1139
- case LINALG_LQ_vecQT:
1140
- gsl_linalg_LQ_vecQT(QR, tau, v);
1141
- break;
1142
- default:
1143
- break;
1144
- }
1145
- return ret;
1146
- }
1147
-
1148
- static VALUE rb_gsl_linalg_QR_QTvec(int argc, VALUE *argv, VALUE obj)
1149
- {
1150
- return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_QR_QTvec);
1151
- }
1152
-
1153
- static VALUE rb_gsl_linalg_QR_Qvec(int argc, VALUE *argv, VALUE obj)
1154
- {
1155
- return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_QR_Qvec);
1156
- }
1157
-
1158
- static VALUE rb_gsl_linalg_LQ_vecQT(int argc, VALUE *argv, VALUE obj)
1159
- {
1160
- return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_LQ_vecQT);
1161
- }
1162
-
1163
- static VALUE rb_gsl_linalg_LQ_vecQ(int argc, VALUE *argv, VALUE obj)
1164
- {
1165
- return rb_gsl_linalg_QRLQ_QTvec(argc, argv, obj, LINALG_LQ_vecQ);
1166
- }
1167
-
1168
- static VALUE rb_gsl_linalg_QRLQ_unpack(int argc, VALUE *argv, VALUE obj,
1169
- int flag)
1170
- {
1171
- gsl_matrix *QR = NULL, *Q = NULL, *R = NULL;
1172
- gsl_vector *tau = NULL;
1173
- int itmp;
1174
- VALUE vtmp, vQ, vR, klass;
1175
- switch (flag) {
1176
- case LINALG_QR_UNPACK:
1177
- klass = cgsl_matrix_QR;
1178
- break;
1179
- case LINALG_LQ_UNPACK:
1180
- klass = cgsl_matrix_LQ;
1181
- break;
1182
- default:
1183
- rb_raise(rb_eRuntimeError, "unknown operation");
1184
- break;
1185
- }
1186
- switch (TYPE(obj)) {
1187
- case T_MODULE: case T_CLASS: case T_OBJECT:
1188
- if (argc != 2) rb_raise(rb_eArgError,
1189
- "wrong number of arguments (%d for 2)", argc);
1190
- vtmp = argv[0];
1191
- itmp = 1;
1192
- break;
1193
- default:
1194
- if (argc != 1) rb_raise(rb_eArgError,
1195
- "wrong number of arguments (%d for 1)", argc);
1196
- vtmp = obj;
1197
- itmp = 0;
1198
- break;
1199
- }
1200
- CHECK_MATRIX(vtmp);
1201
- if (CLASS_OF(vtmp) != klass) {
1202
- rb_raise(rb_eTypeError, "not a QR matrix");
1203
- }
1204
- Data_Get_Struct(vtmp, gsl_matrix, QR);
1205
- if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
1206
- rb_raise(rb_eTypeError, "tau vector must be given.");
1207
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
1208
- Q = gsl_matrix_alloc(QR->size1, QR->size1);
1209
- R = gsl_matrix_alloc(QR->size1, QR->size2);
1210
- switch (flag) {
1211
- case LINALG_QR_UNPACK:
1212
- gsl_linalg_QR_unpack(QR, tau, Q, R);
1213
- vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
1214
- vR = Data_Wrap_Struct(cgsl_matrix_R, 0, gsl_matrix_free, R);
1215
- break;
1216
- case LINALG_LQ_UNPACK:
1217
- gsl_linalg_LQ_unpack(QR, tau, Q, R);
1218
- vQ = Data_Wrap_Struct(cgsl_matrix_L, 0, gsl_matrix_free, Q);
1219
- vR = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, R);
1220
- break;
1221
- default:
1222
- rb_raise(rb_eRuntimeError, "unknown operation");
1223
- break;
1224
- }
1225
- return rb_ary_new3(2, vQ, vR);
1226
- }
1227
-
1228
- static VALUE rb_gsl_linalg_QR_unpack(int argc, VALUE *argv, VALUE obj)
1229
- {
1230
- #ifdef HAVE_NARRAY_H
1231
- if (argc == 2 && NA_IsNArray(argv[0]))
1232
- return rb_gsl_linalg_QR_unpack_narray(argc, argv, obj);
1233
- #endif
1234
- return rb_gsl_linalg_QRLQ_unpack(argc, argv, obj, LINALG_QR_UNPACK);
1235
- }
1236
-
1237
- static VALUE rb_gsl_linalg_LQ_unpack(int argc, VALUE *argv, VALUE obj)
1238
- {
1239
- return rb_gsl_linalg_QRLQ_unpack(argc, argv, obj, LINALG_LQ_UNPACK);
1240
- }
1241
-
1242
- /* singleton */
1243
- static VALUE rb_gsl_linalg_QRLQ_QRLQsolve(int argc, VALUE *argv, VALUE obj,
1244
- int flag)
1245
- {
1246
- gsl_matrix *Q = NULL, *R = NULL;
1247
- gsl_vector *b = NULL, *x = NULL;
1248
- int (*fsolve)(gsl_matrix*, gsl_matrix *, const gsl_vector*, gsl_vector *);
1249
- int flagb = 0;
1250
- VALUE retval;
1251
- switch (argc) {
1252
- case 3:
1253
- CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
1254
- Data_Get_Struct(argv[0], gsl_matrix, Q);
1255
- Data_Get_Struct(argv[1], gsl_matrix, R);
1256
- x = gsl_vector_alloc(Q->size1);
1257
- retval = Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
1258
- break;
1259
- case 4:
1260
- CHECK_MATRIX(argv[0]); CHECK_MATRIX(argv[1]);
1261
- CHECK_VECTOR(argv[3]);
1262
- Data_Get_Struct(argv[0], gsl_matrix, Q);
1263
- Data_Get_Struct(argv[1], gsl_matrix, R);
1264
- Data_Get_Struct(argv[3], gsl_vector, x);
1265
- retval = argv[3];
1266
- break;
1267
- default:
1268
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
1269
- break;
1270
- }
1271
- switch (flag) {
1272
- case LINALG_QR_DECOMP:
1273
- if (CLASS_OF(argv[0]) != cgsl_matrix_Q)
1274
- rb_raise(rb_eTypeError, "not a Q matrix");
1275
- if (CLASS_OF(argv[1]) != cgsl_matrix_R)
1276
- rb_raise(rb_eTypeError, "not a R matrix");
1277
- fsolve = &gsl_linalg_QR_QRsolve;
1278
- break;
1279
- case LINALG_LQ_DECOMP:
1280
- /* if (CLASS_OF(argv[0]) != cgsl_matrix_L)
1281
- rb_raise(rb_eTypeError, "not a L matrix");
1282
- if (CLASS_OF(argv[1]) != cgsl_matrix_Q)
1283
- rb_raise(rb_eTypeError, "not a Q matrix");*/
1284
- fsolve = &gsl_linalg_LQ_LQsolve;
1285
- break;
1286
- default:
1287
- rb_raise(rb_eRuntimeError, "unknown operation");
1288
- break;
1289
- }
1290
- if (TYPE(argv[2]) == T_ARRAY) {
1291
- b = make_cvector_from_rarray(argv[2]);
1292
- flagb = 1;
1293
- } else {
1294
- CHECK_VECTOR(argv[2]);
1295
- Data_Get_Struct(argv[2], gsl_vector, b);
1296
- }
1297
- (*fsolve)(Q, R, b, x);
1298
- if (flagb == 1) gsl_vector_free(b);
1299
- return retval;
1300
- }
1301
-
1302
- /*****/
1303
- static VALUE rb_gsl_linalg_QRLQ_RLsolve(int argc, VALUE *argv, VALUE obj,
1304
- int flag)
1305
- {
1306
- gsl_matrix *QR = NULL, *mtmp;
1307
- gsl_vector *b = NULL, *x = NULL, *tau = NULL;
1308
- size_t istart;
1309
- int (*fsolve)(const gsl_matrix*, const gsl_vector*, gsl_vector *);
1310
- int flagb = 0, flagq = 0;
1311
- VALUE omatrix,retval;
1312
- switch (TYPE(obj)) {
1313
- case T_MODULE: case T_CLASS: case T_OBJECT:
1314
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
1315
- omatrix = argv[0];
1316
- istart = 1;
1317
- break;
1318
- default:
1319
- omatrix = obj;
1320
- istart = 0;
1321
- break;
1322
- }
1323
- CHECK_MATRIX(omatrix);
1324
- Data_Get_Struct(omatrix, gsl_matrix, mtmp);
1325
- switch (argc - istart) {
1326
- case 1:
1327
- x = gsl_vector_alloc(mtmp->size1);
1328
- retval = Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
1329
- break;
1330
- case 2:
1331
- Data_Get_Struct(argv[istart+1], gsl_vector, x);
1332
- retval = argv[istart+1];
1333
- break;
1334
- default:
1335
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
1336
- break;
1337
- }
1338
- QR = mtmp; flagq = 0;
1339
- switch (flag) {
1340
- case LINALG_QR_RSOLVE:
1341
- if (CLASS_OF(omatrix) != cgsl_matrix_QR) {
1342
- QR = make_matrix_clone(mtmp);
1343
- tau = gsl_vector_alloc(QR->size1);
1344
- gsl_linalg_QR_decomp(QR, tau);
1345
- flagq = 1;
1346
- }
1347
- fsolve = &gsl_linalg_QR_Rsolve;
1348
- break;
1349
- case LINALG_R_SOLVE:
1350
- if (CLASS_OF(omatrix) != cgsl_matrix_QR) {
1351
- QR = make_matrix_clone(mtmp);
1352
- tau = gsl_vector_alloc(QR->size1);
1353
- gsl_linalg_QR_decomp(QR, tau);
1354
- flagq = 1;
1355
- }
1356
- fsolve = &gsl_linalg_R_solve;
1357
- break;
1358
- case LINALG_LQ_LSOLVE:
1359
- if (CLASS_OF(omatrix) != cgsl_matrix_LQ) {
1360
- QR = make_matrix_clone(mtmp);
1361
- tau = gsl_vector_alloc(QR->size1);
1362
- gsl_linalg_LQ_decomp(QR, tau);
1363
- flagq = 1;
1364
- }
1365
- fsolve = &gsl_linalg_LQ_Lsolve_T;
1366
- break;
1367
- case LINALG_L_SOLVE:
1368
- if (CLASS_OF(omatrix) != cgsl_matrix_LQ) {
1369
- QR = make_matrix_clone(mtmp);
1370
- tau = gsl_vector_alloc(QR->size1);
1371
- gsl_linalg_LQ_decomp(QR, tau);
1372
- flagq = 1;
1373
- }
1374
- fsolve = &gsl_linalg_L_solve_T;
1375
- break;
1376
- default:
1377
- rb_raise(rb_eRuntimeError, "unknown operation");
1378
- break;
1379
- }
1380
- if (TYPE(argv[istart]) == T_ARRAY) {
1381
- b = make_cvector_from_rarray(argv[istart]);
1382
- flagb = 1;
1383
- } else {
1384
- CHECK_VECTOR(argv[istart]);
1385
- Data_Get_Struct(argv[istart], gsl_vector, b);
1386
- }
1387
- (*fsolve)(QR, b, x);
1388
- if (flagb == 1) gsl_vector_free(b);
1389
- if (flagq == 1) {
1390
- gsl_matrix_free(QR);
1391
- gsl_vector_free(tau);
1392
- }
1393
- return retval;
1394
- }
1395
-
1396
- static VALUE rb_gsl_linalg_QRLQ_RLsvx(int argc, VALUE *argv, VALUE obj,
1397
- int flag)
1398
- {
1399
- gsl_matrix *QR = NULL, *mtmp;
1400
- gsl_vector *x = NULL, *tau = NULL;
1401
- size_t istart;
1402
- int (*fsolve)(const gsl_matrix*, gsl_vector *);
1403
- int flagq = 0;
1404
- VALUE omatrix,retval;
1405
- switch (TYPE(obj)) {
1406
- case T_MODULE: case T_CLASS: case T_OBJECT:
1407
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
1408
- omatrix = argv[0];
1409
- istart = 1;
1410
- break;
1411
- default:
1412
- omatrix = obj;
1413
- istart = 0;
1414
- break;
1415
- }
1416
- CHECK_MATRIX(omatrix);
1417
- Data_Get_Struct(omatrix, gsl_matrix, mtmp);
1418
- switch (argc - istart) {
1419
- case 0:
1420
- x = gsl_vector_alloc(mtmp->size1);
1421
- retval = Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
1422
- break;
1423
- case 1:
1424
- Data_Get_Struct(argv[istart+1], gsl_vector, x);
1425
- retval = argv[istart+1];
1426
- break;
1427
- default:
1428
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
1429
- break;
1430
- }
1431
- QR = mtmp; flagq = 0;
1432
- switch (flag) {
1433
- case LINALG_QR_RSVX:
1434
- if (CLASS_OF(omatrix) != cgsl_matrix_QR) {
1435
- QR = make_matrix_clone(mtmp);
1436
- tau = gsl_vector_alloc(QR->size1);
1437
- gsl_linalg_QR_decomp(QR, tau);
1438
- flagq = 1;
1439
- }
1440
- fsolve = &gsl_linalg_QR_Rsvx;
1441
- break;
1442
- /*
1443
- case LINALG_R_SVX:
1444
- if (CLASS_OF(omatrix) != cgsl_matrix_QR) {
1445
- QR = make_matrix_clone(mtmp);
1446
- tau = gsl_vector_alloc(QR->size1);
1447
- gsl_linalg_QR_decomp(QR, tau);
1448
- flagq = 1;
1449
- }
1450
- fsolve = &gsl_linalg_R_svx;
1451
- break;
1452
- */
1453
- case LINALG_LQ_LSVX:
1454
- if (CLASS_OF(omatrix) != cgsl_matrix_LQ) {
1455
- QR = make_matrix_clone(mtmp);
1456
- tau = gsl_vector_alloc(QR->size1);
1457
- gsl_linalg_LQ_decomp(QR, tau);
1458
- flagq = 1;
1459
- }
1460
- fsolve = &gsl_linalg_LQ_Lsvx_T;
1461
- break;
1462
- default:
1463
- rb_raise(rb_eRuntimeError, "unknown operation");
1464
- break;
1465
- }
1466
- (*fsolve)(QR, x);
1467
- if (flagq == 1) {
1468
- gsl_matrix_free(QR);
1469
- gsl_vector_free(tau);
1470
- }
1471
- return retval;
1472
- }
1473
-
1474
- static VALUE rb_gsl_linalg_QR_Rsolve(int argc, VALUE *argv, VALUE obj)
1475
- {
1476
- return rb_gsl_linalg_QRLQ_RLsolve(argc, argv, obj, LINALG_QR_RSOLVE);
1477
- }
1478
-
1479
- static VALUE rb_gsl_linalg_QR_Rsvx(int argc, VALUE *argv, VALUE obj)
1480
- {
1481
- return rb_gsl_linalg_QRLQ_RLsvx(argc, argv, obj, LINALG_QR_RSVX);
1482
- }
1483
-
1484
- static VALUE rb_gsl_linalg_R_solve(int argc, VALUE *argv, VALUE obj)
1485
- {
1486
- return rb_gsl_linalg_QRLQ_RLsolve(argc, argv, obj, LINALG_R_SOLVE);
1487
- }
1488
-
1489
- /* singleton */
1490
- static VALUE rb_gsl_linalg_QR_QRsolve(int argc, VALUE *argv, VALUE obj,
1491
- int flag)
1492
- {
1493
- return rb_gsl_linalg_QRLQ_QRLQsolve(argc, argv, obj, LINALG_QR_DECOMP);
1494
- }
1495
-
1496
- static VALUE rb_gsl_linalg_LQ_Lsolve(int argc, VALUE *argv, VALUE obj)
1497
- {
1498
- return rb_gsl_linalg_QRLQ_RLsolve(argc, argv, obj, LINALG_LQ_LSOLVE);
1499
- }
1500
-
1501
- static VALUE rb_gsl_linalg_LQ_Lsvx(int argc, VALUE *argv, VALUE obj)
1502
- {
1503
- return rb_gsl_linalg_QRLQ_RLsvx(argc, argv, obj, LINALG_LQ_LSVX);
1504
- }
1505
-
1506
- static VALUE rb_gsl_linalg_L_solve(int argc, VALUE *argv, VALUE obj)
1507
- {
1508
- return rb_gsl_linalg_QRLQ_RLsolve(argc, argv, obj, LINALG_L_SOLVE);
1509
- }
1510
-
1511
- /* singleton */
1512
- static VALUE rb_gsl_linalg_LQ_LQsolve(int argc, VALUE *argv, VALUE obj,
1513
- int flag)
1514
- {
1515
- return rb_gsl_linalg_QRLQ_QRLQsolve(argc, argv, obj, LINALG_LQ_DECOMP);
1516
- }
1517
-
1518
- static VALUE rb_gsl_linalg_QRLQ_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
1519
- VALUE vv, int flag)
1520
- {
1521
- gsl_matrix *Q = NULL, *R = NULL;
1522
- gsl_vector *w = NULL, *v = NULL;
1523
- int status;
1524
- CHECK_MATRIX(qq); CHECK_MATRIX(rr);
1525
- CHECK_VECTOR(ww); CHECK_VECTOR(vv);
1526
- Data_Get_Struct(qq, gsl_matrix, Q);
1527
- Data_Get_Struct(rr, gsl_matrix, R);
1528
- Data_Get_Struct(ww, gsl_vector, w);
1529
- Data_Get_Struct(vv, gsl_vector, v);
1530
- switch (flag) {
1531
- case LINALG_QR_DECOMP:
1532
- status = gsl_linalg_QR_update(Q, R, w, v);
1533
- break;
1534
- case LINALG_LQ_DECOMP:
1535
- status = gsl_linalg_LQ_update(Q, R, w, v);
1536
- break;
1537
- default:
1538
- rb_raise(rb_eRuntimeError, "unknown operation");
1539
- break;
1540
- }
1541
- return INT2FIX(status);
1542
- }
1543
-
1544
- /* singleton */
1545
- static VALUE rb_gsl_linalg_QR_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
1546
- VALUE vv)
1547
- {
1548
- return rb_gsl_linalg_QRLQ_update(obj, qq, rr, ww, vv, LINALG_QR_DECOMP);
1549
- }
1550
-
1551
- static VALUE rb_gsl_linalg_LQ_update(VALUE obj, VALUE qq, VALUE rr, VALUE ww,
1552
- VALUE vv)
1553
- {
1554
- return rb_gsl_linalg_QRLQ_update(obj, qq, rr, ww, vv, LINALG_LQ_DECOMP);
1555
- }
1556
-
1557
- /******/
1558
- enum {
1559
- LINALG_QRPT,
1560
- LINALG_PTLQ,
1561
- };
1562
-
1563
- static VALUE rb_gsl_linalg_QRLQPT_decomp(int argc, VALUE *argv, VALUE obj, int flag)
1564
- {
1565
- gsl_matrix *A = NULL, *QR = NULL;
1566
- gsl_vector *tau = NULL, *norm = NULL;
1567
- gsl_permutation *p = NULL;
1568
- int signum;
1569
- size_t size0;
1570
- VALUE vtau, vp, vA, vQR;
1571
- switch (TYPE(obj)) {
1572
- case T_MODULE: case T_CLASS: case T_OBJECT:
1573
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
1574
- argc);
1575
- vA = argv[0];
1576
- break;
1577
- default:
1578
- vA = obj;
1579
- break;
1580
- }
1581
- CHECK_MATRIX(vA);
1582
- Data_Get_Struct(vA, gsl_matrix, A);
1583
- QR = make_matrix_clone(A);
1584
- size0 = GSL_MIN(A->size1, A->size2);
1585
- tau = gsl_vector_alloc(size0);
1586
- p = gsl_permutation_alloc(size0);
1587
- norm = gsl_vector_alloc(size0);
1588
- switch (flag) {
1589
- case LINALG_QRPT:
1590
- vQR = Data_Wrap_Struct(cgsl_matrix_QRPT, 0, gsl_matrix_free, QR);
1591
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
1592
- vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
1593
- gsl_linalg_QRPT_decomp(QR, tau, p, &signum, norm);
1594
- break;
1595
- case LINALG_PTLQ:
1596
- vQR = Data_Wrap_Struct(cgsl_matrix_PTLQ, 0, gsl_matrix_free, QR);
1597
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
1598
- vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
1599
- gsl_linalg_PTLQ_decomp(QR, tau, p, &signum, norm);
1600
- break;
1601
- default:
1602
- rb_raise(rb_eRuntimeError, "unknown operation");
1603
- break;
1604
- }
1605
- gsl_vector_free(norm);
1606
- return rb_ary_new3(4, vQR, vtau, vp, INT2FIX(signum));
1607
- }
1608
-
1609
- static VALUE rb_gsl_linalg_QRLQPT_decomp_bang(int argc, VALUE *argv, VALUE obj, int flag)
1610
- {
1611
- gsl_matrix *A = NULL;
1612
- gsl_vector *tau = NULL, *norm = NULL;
1613
- gsl_permutation *p = NULL;
1614
- int signum;
1615
- size_t size0;
1616
- VALUE vtau, vp, vA;
1617
- switch (TYPE(obj)) {
1618
- case T_MODULE: case T_CLASS: case T_OBJECT:
1619
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
1620
- argc);
1621
- vA = argv[0];
1622
- break;
1623
- default:
1624
- vA = obj;
1625
- break;
1626
- }
1627
- CHECK_MATRIX(vA);
1628
- Data_Get_Struct(vA, gsl_matrix, A);
1629
- size0 = GSL_MIN(A->size1, A->size2);
1630
- tau = gsl_vector_alloc(size0);
1631
- p = gsl_permutation_alloc(size0);
1632
- norm = gsl_vector_alloc(size0);
1633
- switch (flag) {
1634
- case LINALG_QRPT:
1635
- RBGSL_SET_CLASS(vA, cgsl_matrix_QRPT);
1636
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
1637
- vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
1638
- gsl_linalg_QRPT_decomp(A, tau, p, &signum, norm);
1639
- break;
1640
- case LINALG_PTLQ:
1641
- RBGSL_SET_CLASS(vA, cgsl_matrix_PTLQ);
1642
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
1643
- vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
1644
- gsl_linalg_PTLQ_decomp(A, tau, p, &signum, norm);
1645
- break;
1646
- default:
1647
- rb_raise(rb_eRuntimeError, "unknown operation");
1648
- break;
1649
- }
1650
- gsl_vector_free(norm);
1651
- return rb_ary_new3(3, vtau, vp, INT2FIX(signum));
1652
- }
1653
-
1654
- static VALUE rb_gsl_linalg_QRPT_decomp(int argc, VALUE *argv, VALUE obj)
1655
- {
1656
- return rb_gsl_linalg_QRLQPT_decomp(argc, argv, obj, LINALG_QRPT);
1657
- }
1658
-
1659
- static VALUE rb_gsl_linalg_QRPT_decomp_bang(int argc, VALUE *argv, VALUE obj)
1660
- {
1661
- return rb_gsl_linalg_QRLQPT_decomp_bang(argc, argv, obj, LINALG_QRPT);
1662
- }
1663
-
1664
- static VALUE rb_gsl_linalg_PTLQ_decomp(int argc, VALUE *argv, VALUE obj)
1665
- {
1666
- return rb_gsl_linalg_QRLQPT_decomp(argc, argv, obj, LINALG_PTLQ);
1667
- }
1668
-
1669
- static VALUE rb_gsl_linalg_PTLQ_decomp_bang(int argc, VALUE *argv, VALUE obj)
1670
- {
1671
- return rb_gsl_linalg_QRLQPT_decomp_bang(argc, argv, obj, LINALG_PTLQ);
1672
- }
1673
-
1674
- static VALUE rb_gsl_linalg_QRLQPT_decomp2(int argc, VALUE *argv, VALUE obj,int flag)
1675
- {
1676
- gsl_matrix *A = NULL, *Q = NULL, *R = NULL;
1677
- gsl_vector *tau = NULL, *norm = NULL;
1678
- gsl_permutation *p = NULL;
1679
- int signum;
1680
- size_t size0;
1681
- VALUE vtau, vp, vA, vQ, vR;
1682
- switch (TYPE(obj)) {
1683
- case T_MODULE: case T_CLASS: case T_OBJECT:
1684
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments");
1685
- vA = argv[0];
1686
- break;
1687
- default:
1688
- if (argc != 0) rb_raise(rb_eArgError, "wrong number of arguments");
1689
- vA = obj;
1690
- break;
1691
- }
1692
- CHECK_MATRIX(vA);
1693
- Data_Get_Struct(vA, gsl_matrix, A);
1694
- Q = gsl_matrix_alloc(A->size1, A->size2);
1695
- R = gsl_matrix_alloc(A->size1, A->size2);
1696
- size0 = GSL_MIN(A->size1, A->size2);
1697
- tau = gsl_vector_alloc(size0);
1698
- p = gsl_permutation_alloc(size0);
1699
- norm = gsl_vector_alloc(size0);
1700
- /* vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
1701
- vR = Data_Wrap_Struct(cgsl_matrix_R, 0, gsl_matrix_free, R);*/
1702
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
1703
- vp = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
1704
- switch (flag) {
1705
- case LINALG_QRPT:
1706
- vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
1707
- vR = Data_Wrap_Struct(cgsl_matrix_R, 0, gsl_matrix_free, R);
1708
- gsl_linalg_QRPT_decomp2(A, Q, R, tau, p, &signum, norm);
1709
- break;
1710
- case LINALG_PTLQ:
1711
- vR = Data_Wrap_Struct(cgsl_matrix_L, 0, gsl_matrix_free, R);
1712
- vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
1713
- gsl_linalg_PTLQ_decomp2(A, Q, R, tau, p, &signum, norm);
1714
- break;
1715
- default:
1716
- rb_raise(rb_eRuntimeError, "unknown operation");
1717
- }
1718
- gsl_vector_free(norm);
1719
- return rb_ary_new3(5, vQ, vR, vtau, vp, INT2FIX(signum));
1720
- }
1721
-
1722
- static VALUE rb_gsl_linalg_QRPT_decomp2(int argc, VALUE *argv, VALUE obj)
1723
- {
1724
- return rb_gsl_linalg_QRLQPT_decomp2(argc, argv, obj, LINALG_QRPT);
1725
- }
1726
-
1727
- static VALUE rb_gsl_linalg_PTLQ_decomp2(int argc, VALUE *argv, VALUE obj)
1728
- {
1729
- return rb_gsl_linalg_QRLQPT_decomp2(argc, argv, obj, LINALG_PTLQ);
1730
- }
1731
-
1732
- int gsl_linalg_PTLQ_solve_T(const gsl_matrix * QR, const gsl_vector * tau,
1733
- const gsl_permutation * p, const gsl_vector * b,
1734
- gsl_vector * x);
1735
- int gsl_linalg_PTLQ_svx_T(const gsl_matrix * LQ,
1736
- const gsl_vector * tau,
1737
- const gsl_permutation * p,
1738
- gsl_vector * x);
1739
- int gsl_linalg_PTLQ_LQsolve_T (const gsl_matrix * Q, const gsl_matrix * L,
1740
- const gsl_permutation * p,
1741
- const gsl_vector * b,
1742
- gsl_vector * x);
1743
- int gsl_linalg_PTLQ_Lsolve_T (const gsl_matrix * LQ,
1744
- const gsl_permutation * p,
1745
- const gsl_vector * b,
1746
- gsl_vector * x);
1747
- int gsl_linalg_PTLQ_Lsvx_T (const gsl_matrix * LQ,
1748
- const gsl_permutation * p,
1749
- gsl_vector * x);
1750
-
1751
- static VALUE rb_gsl_linalg_QRLQPT_solve(int argc, VALUE *argv, VALUE obj, int flag)
1752
- {
1753
- gsl_matrix *QR = NULL, *A = NULL;
1754
- gsl_vector *tau = NULL, *b = NULL, *x = NULL, *norm = NULL;
1755
- gsl_permutation *p = NULL;
1756
- int signum, itmp, flagb = 0, flagq = 0;
1757
- VALUE vtmp, klass;
1758
- size_t size0;
1759
- int (*fdecomp)(gsl_matrix*, gsl_vector*, gsl_permutation*, int *, gsl_vector*);
1760
- int (*fsolve)(const gsl_matrix*, const gsl_vector*, const gsl_permutation*,
1761
- const gsl_vector*, gsl_vector *);
1762
- switch (flag) {
1763
- case LINALG_QRPT:
1764
- klass = cgsl_matrix_QRPT;
1765
- fdecomp = &gsl_linalg_QRPT_decomp;
1766
- fsolve = &gsl_linalg_QRPT_solve;
1767
- break;
1768
- case LINALG_PTLQ:
1769
- klass = cgsl_matrix_PTLQ;
1770
- fdecomp = &gsl_linalg_PTLQ_decomp;
1771
- fsolve = &gsl_linalg_PTLQ_solve_T;
1772
- break;
1773
- default:
1774
- rb_raise(rb_eRuntimeError, "unknown operation");
1775
- break;
1776
- }
1777
- switch (TYPE(obj)) {
1778
- case T_MODULE: case T_CLASS: case T_OBJECT:
1779
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
1780
- vtmp = argv[0];
1781
- itmp = 1;
1782
- break;
1783
- default:
1784
- vtmp = obj;
1785
- itmp = 0;
1786
- break;
1787
- }
1788
- CHECK_MATRIX(vtmp);
1789
- if (CLASS_OF(vtmp) == klass) {
1790
- if (argc-itmp != 3) rb_raise(rb_eArgError,
1791
- "wrong number of arguments (%d for %d)",
1792
- argc, 4-itmp);
1793
- CHECK_VECTOR(argv[itmp]);
1794
- if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
1795
- rb_raise(rb_eTypeError, "not a tau vector");
1796
- CHECK_PERMUTATION(argv[itmp+1]);
1797
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
1798
- Data_Get_Struct(argv[itmp+1], gsl_permutation, p);
1799
- Data_Get_Struct(vtmp, gsl_matrix, QR);
1800
- size0 = GSL_MIN(QR->size1, QR->size2);
1801
- itmp += 2;
1802
- } else {
1803
- if (argc-itmp != 1) rb_raise(rb_eArgError,
1804
- "wrong number of arguments (%d for %d)", argc, 2-itmp);
1805
- Data_Get_Struct(vtmp, gsl_matrix, A);
1806
- QR = make_matrix_clone(A);
1807
- size0 = GSL_MIN(QR->size1, QR->size2);
1808
- flagq = 1;
1809
- p = gsl_permutation_alloc(size0);
1810
- tau = gsl_vector_alloc(size0);
1811
- }
1812
- norm = gsl_vector_alloc(size0);
1813
- if (TYPE(argv[itmp]) == T_ARRAY) {
1814
- b = make_cvector_from_rarray(argv[itmp]);
1815
- flagb = 1;
1816
- } else {
1817
- CHECK_VECTOR(argv[itmp]);
1818
- Data_Get_Struct(argv[itmp], gsl_vector, b);
1819
- }
1820
- x = gsl_vector_alloc(b->size);
1821
- if (flagq == 1) (*fdecomp)(QR, tau, p, &signum, norm);
1822
- (*fsolve)(QR, tau, p, b, x);
1823
- if (flagb == 1) gsl_vector_free(b);
1824
- if (flagq == 1) {
1825
- gsl_matrix_free(QR);
1826
- gsl_permutation_free(p);
1827
- gsl_vector_free(tau);
1828
- gsl_vector_free(norm);
1829
- }
1830
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
1831
- }
1832
-
1833
- static VALUE rb_gsl_linalg_QRPT_solve(int argc, VALUE *argv, VALUE obj)
1834
- {
1835
- return rb_gsl_linalg_QRLQPT_solve(argc, argv, obj, LINALG_QRPT);
1836
- }
1837
-
1838
- static VALUE rb_gsl_linalg_PTLQ_solve(int argc, VALUE *argv, VALUE obj)
1839
- {
1840
- return rb_gsl_linalg_QRLQPT_solve(argc, argv, obj, LINALG_PTLQ);
1841
- }
1842
-
1843
- static VALUE rb_gsl_linalg_QRLQPT_svx(int argc, VALUE *argv, VALUE obj, int flag)
1844
- {
1845
- gsl_matrix *QR = NULL, *A = NULL;
1846
- gsl_vector *tau = NULL, *b = NULL, *norm = NULL;
1847
- gsl_permutation *p = NULL;
1848
- int signum, itmp, flagq = 0;
1849
- VALUE vtmp, klass;
1850
- size_t size0;
1851
- int (*fdecomp)(gsl_matrix*, gsl_vector*, gsl_permutation*, int *, gsl_vector*);
1852
- int (*fsvx)(const gsl_matrix*, const gsl_vector*, const gsl_permutation*,
1853
- gsl_vector *);
1854
- switch (flag) {
1855
- case LINALG_QRPT:
1856
- klass = cgsl_matrix_QRPT;
1857
- fdecomp = &gsl_linalg_QRPT_decomp;
1858
- fsvx = &gsl_linalg_QRPT_svx;
1859
- break;
1860
- case LINALG_PTLQ:
1861
- klass = cgsl_matrix_PTLQ;
1862
- fdecomp = &gsl_linalg_PTLQ_decomp;
1863
- fsvx = &gsl_linalg_PTLQ_svx_T;
1864
- break;
1865
- default:
1866
- rb_raise(rb_eRuntimeError, "unknown operation");
1867
- break;
1868
- }
1869
-
1870
- switch (TYPE(obj)) {
1871
- case T_MODULE: case T_CLASS: case T_OBJECT:
1872
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
1873
- argc);
1874
- vtmp = argv[0];
1875
- itmp = 1;
1876
- break;
1877
- default:
1878
- vtmp = obj;
1879
- itmp = 0;
1880
- break;
1881
- }
1882
- CHECK_MATRIX(vtmp);
1883
- if (CLASS_OF(vtmp) == klass) {
1884
- if (argc-itmp != 3) rb_raise(rb_eArgError,
1885
- "wrong number of arguments (%d for %d)",
1886
- argc, 3+itmp);
1887
- CHECK_VECTOR(argv[itmp]);
1888
- if (CLASS_OF(argv[itmp]) != cgsl_vector_tau)
1889
- rb_raise(rb_eTypeError, "not a tau vector");
1890
- CHECK_PERMUTATION(argv[itmp+1]);
1891
- Data_Get_Struct(argv[itmp], gsl_vector, tau);
1892
- Data_Get_Struct(argv[itmp+1], gsl_permutation, p);
1893
- Data_Get_Struct(vtmp, gsl_matrix, QR);
1894
- size0 = GSL_MIN(QR->size1, QR->size2);
1895
- itmp += 2;
1896
- } else {
1897
- if (argc-itmp != 1) rb_raise(rb_eArgError,
1898
- "wrong number of arguments (%d for %d)", argc, 2+itmp);
1899
- Data_Get_Struct(vtmp, gsl_matrix, A);
1900
- QR = make_matrix_clone(A);
1901
- size0 = GSL_MIN(QR->size1, QR->size2);
1902
- flagq = 1;
1903
- p = gsl_permutation_alloc(size0);
1904
- tau = gsl_vector_alloc(size0);
1905
- }
1906
- norm = gsl_vector_alloc(size0);
1907
- CHECK_VECTOR(argv[itmp]);
1908
- Data_Get_Struct(argv[itmp], gsl_vector, b);
1909
- if (flagq == 1) (*fdecomp)(QR, tau, p, &signum, norm);
1910
- (*fsvx)(QR, tau, p, b);
1911
- if (flagq == 1) {
1912
- gsl_matrix_free(QR);
1913
- gsl_permutation_free(p);
1914
- gsl_vector_free(tau);
1915
- gsl_vector_free(norm);
1916
- }
1917
- return argv[itmp];
1918
- }
1919
-
1920
- static VALUE rb_gsl_linalg_QRPT_svx(int argc, VALUE *argv, VALUE obj)
1921
- {
1922
- return rb_gsl_linalg_QRLQPT_svx(argc, argv, obj, LINALG_QRPT);
1923
- }
1924
-
1925
- static VALUE rb_gsl_linalg_PTLQ_svx(int argc, VALUE *argv, VALUE obj)
1926
- {
1927
- return rb_gsl_linalg_QRLQPT_svx(argc, argv, obj, LINALG_PTLQ);
1928
- }
1929
-
1930
- /* singleton */
1931
- static VALUE rb_gsl_linalg_QRLQPT_QRLQsolve(VALUE obj, VALUE qq, VALUE rr,
1932
- VALUE pp, VALUE bb, int flag)
1933
- {
1934
- gsl_matrix *Q = NULL, *R = NULL;
1935
- gsl_vector *b = NULL, *x = NULL;
1936
- gsl_permutation *p = NULL;
1937
- int flagb = 0;
1938
- int (*fsolve)(const gsl_matrix*, const gsl_matrix*, const gsl_permutation*,
1939
- const gsl_vector*, gsl_vector*);
1940
- switch (flag) {
1941
- case LINALG_QRPT:
1942
- if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
1943
- if (CLASS_OF(rr) != cgsl_matrix_R) rb_raise(rb_eTypeError, "not a R matrix");
1944
- fsolve = &gsl_linalg_QRPT_QRsolve;
1945
- break;
1946
- case LINALG_PTLQ:
1947
- if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
1948
- if (CLASS_OF(rr) != cgsl_matrix_L) rb_raise(rb_eTypeError, "not a L matrix");
1949
- fsolve = &gsl_linalg_PTLQ_LQsolve_T;
1950
- break;
1951
- default:
1952
- rb_raise(rb_eRuntimeError, "unknown operation");
1953
- break;
1954
- }
1955
- if (TYPE(bb) == T_ARRAY) {
1956
- b = make_cvector_from_rarray(bb);
1957
- flagb = 1;
1958
- } else {
1959
- CHECK_VECTOR(bb);
1960
- Data_Get_Struct(bb, gsl_vector, b);
1961
- }
1962
- CHECK_PERMUTATION(pp);
1963
- Data_Get_Struct(qq, gsl_matrix, Q);
1964
- Data_Get_Struct(rr, gsl_matrix, R);
1965
- Data_Get_Struct(pp, gsl_permutation, p);
1966
- x = gsl_vector_alloc(b->size);
1967
- (*fsolve)(Q, R, p, b, x);
1968
- if (flagb == 1) gsl_vector_free(b);
1969
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
1970
- }
1971
-
1972
- static VALUE rb_gsl_linalg_QRPT_QRsolve(VALUE obj, VALUE qq, VALUE rr,
1973
- VALUE pp, VALUE bb)
1974
- {
1975
- return rb_gsl_linalg_QRLQPT_QRLQsolve(obj, qq, rr, pp, bb, LINALG_QRPT);
1976
- }
1977
-
1978
- static VALUE rb_gsl_linalg_PTLQ_LQsolve(VALUE obj, VALUE qq, VALUE rr,
1979
- VALUE pp, VALUE bb)
1980
- {
1981
- return rb_gsl_linalg_QRLQPT_QRLQsolve(obj, qq, rr, pp, bb, LINALG_PTLQ);
1982
- }
1983
-
1984
- /* singleton */
1985
- static VALUE rb_gsl_linalg_QRLQPT_update(VALUE obj, VALUE qq, VALUE rr,
1986
- VALUE pp, VALUE ww, VALUE vv, int flag)
1987
- {
1988
- gsl_matrix *Q = NULL, *R = NULL;
1989
- gsl_vector *w = NULL, *v = NULL;
1990
- gsl_permutation *p = NULL;
1991
- switch (flag) {
1992
- case LINALG_QRPT:
1993
- if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
1994
- if (CLASS_OF(rr) != cgsl_matrix_R) rb_raise(rb_eTypeError, "not a R matrix");
1995
- break;
1996
- case LINALG_PTLQ:
1997
- if (CLASS_OF(qq) != cgsl_matrix_Q) rb_raise(rb_eTypeError, "not a Q matrix");
1998
- if (CLASS_OF(rr) != cgsl_matrix_L) rb_raise(rb_eTypeError, "not a L matrix");
1999
- break;
2000
- }
2001
- CHECK_PERMUTATION(pp);
2002
- Data_Get_Struct(qq, gsl_matrix, Q);
2003
- Data_Get_Struct(rr, gsl_matrix, R);
2004
- Data_Get_Struct(pp, gsl_permutation, p);
2005
- Data_Get_Struct(ww, gsl_vector, w);
2006
- Data_Get_Struct(vv, gsl_vector, v);
2007
- switch (flag) {
2008
- case LINALG_QRPT:
2009
- gsl_linalg_QRPT_update(Q, R, p, w, v);
2010
- break;
2011
- case LINALG_PTLQ:
2012
- gsl_linalg_PTLQ_update(Q, R, p, w, v);
2013
- break;
2014
- }
2015
- return obj;
2016
- }
2017
-
2018
- static VALUE rb_gsl_linalg_QRPT_update(VALUE obj, VALUE qq, VALUE rr,
2019
- VALUE pp, VALUE ww, VALUE vv)
2020
- {
2021
- return rb_gsl_linalg_QRLQPT_update(obj, qq, rr, pp, ww, vv, LINALG_QRPT);
2022
- }
2023
-
2024
- static VALUE rb_gsl_linalg_PTLQ_update(VALUE obj, VALUE qq, VALUE rr,
2025
- VALUE pp, VALUE ww, VALUE vv)
2026
- {
2027
- return rb_gsl_linalg_QRLQPT_update(obj, qq, rr, pp, ww, vv, LINALG_PTLQ);
2028
- }
2029
-
2030
- static VALUE rb_gsl_linalg_QRLQPT_RLsolve(int argc, VALUE *argv, VALUE obj, int flag)
2031
- {
2032
- gsl_matrix *QR = NULL;
2033
- gsl_vector *b = NULL, *x = NULL;
2034
- gsl_permutation *p = NULL;
2035
- int itmp, flagb = 0;
2036
- VALUE vtmp, klass;
2037
- int (*fsolve)(const gsl_matrix*, const gsl_permutation*, const gsl_vector*,
2038
- gsl_vector*);
2039
- switch (flag) {
2040
- case LINALG_QRPT:
2041
- klass = cgsl_matrix_QRPT;
2042
- fsolve = &gsl_linalg_QRPT_Rsolve;
2043
- break;
2044
- case LINALG_PTLQ:
2045
- klass = cgsl_matrix_PTLQ;
2046
- fsolve = &gsl_linalg_PTLQ_Lsolve_T;
2047
- break;
2048
- default:
2049
- rb_raise(rb_eRuntimeError, "unknown operation");
2050
- break;
2051
- }
2052
- switch (TYPE(obj)) {
2053
- case T_MODULE: case T_CLASS: case T_OBJECT:
2054
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
2055
- argc);
2056
- vtmp = argv[0];
2057
- itmp = 1;
2058
- break;
2059
- default:
2060
- vtmp = obj;
2061
- itmp = 0;
2062
- break;
2063
- }
2064
- if (argc-itmp != 2)
2065
- rb_raise(rb_eArgError, "wrong number of argument (%d for %d)", argc, 2+itmp);
2066
- CHECK_MATRIX(vtmp);
2067
- if (CLASS_OF(vtmp) != klass) {
2068
- rb_raise(rb_eArgError, "not a QR matrix");
2069
- }
2070
- CHECK_PERMUTATION(argv[itmp]);
2071
- Data_Get_Struct(argv[itmp], gsl_permutation, p);
2072
- Data_Get_Struct(vtmp, gsl_matrix, QR);
2073
- itmp++;
2074
- if (TYPE(argv[itmp]) == T_ARRAY) {
2075
- b = make_cvector_from_rarray(argv[itmp]);
2076
- flagb = 1;
2077
- } else {
2078
- CHECK_VECTOR(argv[itmp]);
2079
- Data_Get_Struct(argv[itmp], gsl_vector, b);
2080
- }
2081
- x = gsl_vector_alloc(b->size);
2082
- (*fsolve)(QR, p, b, x);
2083
- if (flagb == 1) gsl_vector_free(b);
2084
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
2085
- }
2086
-
2087
- static VALUE rb_gsl_linalg_QRPT_Rsolve(int argc, VALUE *argv, VALUE obj)
2088
- {
2089
- return rb_gsl_linalg_QRLQPT_RLsolve(argc, argv, obj, LINALG_QRPT);
2090
- }
2091
-
2092
- static VALUE rb_gsl_linalg_PTLQ_Lsolve(int argc, VALUE *argv, VALUE obj)
2093
- {
2094
- return rb_gsl_linalg_QRLQPT_RLsolve(argc, argv, obj, LINALG_PTLQ);
2095
- }
2096
-
2097
- static VALUE rb_gsl_linalg_QRLQPT_RLsvx(int argc, VALUE *argv, VALUE obj, int flag)
2098
- {
2099
- gsl_matrix *QR = NULL;
2100
- gsl_vector *b = NULL;
2101
- gsl_permutation *p = NULL;
2102
- int itmp;
2103
- VALUE vtmp, klass;
2104
- int (*fsvx)(const gsl_matrix*, const gsl_permutation*, gsl_vector*);
2105
- switch (flag) {
2106
- case LINALG_QRPT:
2107
- klass = cgsl_matrix_QRPT;
2108
- fsvx = &gsl_linalg_QRPT_Rsvx;
2109
- break;
2110
- case LINALG_PTLQ:
2111
- klass = cgsl_matrix_PTLQ;
2112
- fsvx = &gsl_linalg_PTLQ_Lsvx_T;
2113
- default:
2114
- rb_raise(rb_eRuntimeError, "unknown operation");
2115
- break;
2116
- }
2117
- switch (TYPE(obj)) {
2118
- case T_MODULE: case T_CLASS: case T_OBJECT:
2119
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
2120
- argc);
2121
- vtmp = argv[0];
2122
- itmp = 1;
2123
- break;
2124
- default:
2125
- vtmp = obj;
2126
- itmp = 0;
2127
- break;
2128
- }
2129
- if (argc-itmp != 2)
2130
- rb_raise(rb_eArgError, "wrong number of argument (%d for %d)", argc, 2+itmp);
2131
- CHECK_MATRIX(vtmp);
2132
- if (CLASS_OF(vtmp) != klass) {
2133
- rb_raise(rb_eArgError, "not a QR matrix");
2134
- }
2135
- CHECK_PERMUTATION(argv[itmp]);
2136
- Data_Get_Struct(argv[itmp], gsl_permutation, p);
2137
- Data_Get_Struct(vtmp, gsl_matrix, QR);
2138
- itmp++;
2139
- if (TYPE(argv[itmp]) == T_ARRAY) {
2140
- b = make_cvector_from_rarray(argv[itmp]);
2141
- } else {
2142
- CHECK_VECTOR(argv[itmp]);
2143
- Data_Get_Struct(argv[itmp], gsl_vector, b);
2144
- }
2145
- (*fsvx)(QR, p, b);
2146
- return argv[itmp];
2147
- }
2148
-
2149
- static VALUE rb_gsl_linalg_QRPT_Rsvx(int argc, VALUE *argv, VALUE obj)
2150
- {
2151
- return rb_gsl_linalg_QRLQPT_RLsvx(argc, argv, obj, LINALG_QRPT);
2152
- }
2153
-
2154
- static VALUE rb_gsl_linalg_PTLQ_Lsvx(int argc, VALUE *argv, VALUE obj)
2155
- {
2156
- return rb_gsl_linalg_QRLQPT_RLsvx(argc, argv, obj, LINALG_PTLQ);
2157
- }
2158
-
2159
- /*******/
2160
- #ifdef HAVE_NARRAY_H
2161
- static VALUE rb_gsl_linalg_SV_decomp_narray(int argc, VALUE *argv, VALUE obj)
2162
- {
2163
- struct NARRAY *A;
2164
- gsl_matrix_view uv, vv;
2165
- gsl_vector_view sv;
2166
- gsl_vector *work;
2167
- VALUE u, s, v;
2168
- int shape[2];
2169
- GetNArray(argv[0], A);
2170
- shape[0] = A->shape[0];
2171
- shape[1] = A->shape[0];
2172
- u = na_make_object(NA_DFLOAT, 2, A->shape, CLASS_OF(argv[0]));
2173
- v = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
2174
- s = na_make_object(NA_DFLOAT, 1, &(shape[0]), cNVector);
2175
- uv = gsl_matrix_view_array(NA_PTR_TYPE(u,double*), A->shape[1], A->shape[0]);
2176
- vv = gsl_matrix_view_array(NA_PTR_TYPE(v,double*), shape[1], shape[0]);
2177
- sv = gsl_vector_view_array(NA_PTR_TYPE(s,double*), shape[0]);
2178
- work = gsl_vector_alloc(shape[0]);
2179
- memcpy(NA_PTR_TYPE(u,double*), (double*)A->ptr, sizeof(double)*A->total);
2180
- gsl_linalg_SV_decomp(&uv.matrix, &vv.matrix, &sv.vector, work);
2181
- gsl_vector_free(work);
2182
- return rb_ary_new3(3, u, v, s);
2183
- }
2184
-
2185
- static VALUE rb_gsl_linalg_SV_decomp_jacobi_narray(int argc, VALUE *argv, VALUE obj)
2186
- {
2187
- struct NARRAY *A;
2188
- gsl_matrix_view uv, vv;
2189
- gsl_vector_view sv;
2190
- VALUE u, s, v;
2191
- int shape[2];
2192
- GetNArray(argv[0], A);
2193
- shape[0] = A->shape[0];
2194
- shape[1] = A->shape[0];
2195
- u = na_make_object(NA_DFLOAT, 2, A->shape, CLASS_OF(argv[0]));
2196
- v = na_make_object(NA_DFLOAT, 2, shape, CLASS_OF(argv[0]));
2197
- s = na_make_object(NA_DFLOAT, 1, &(shape[0]), cNVector);
2198
- uv = gsl_matrix_view_array(NA_PTR_TYPE(u,double*), A->shape[1], A->shape[0]);
2199
- vv = gsl_matrix_view_array(NA_PTR_TYPE(v,double*), shape[1], shape[0]);
2200
- sv = gsl_vector_view_array(NA_PTR_TYPE(s,double*), shape[0]);
2201
- memcpy(NA_PTR_TYPE(u,double*), (double*)A->ptr, sizeof(double)*A->total);
2202
- gsl_linalg_SV_decomp_jacobi(&uv.matrix, &vv.matrix, &sv.vector);
2203
- return rb_ary_new3(3, u, v, s);
2204
- }
2205
-
2206
- static VALUE rb_gsl_linalg_SV_solve_narray(int argc, VALUE *argv, VALUE obj)
2207
- {
2208
- struct NARRAY *A;
2209
- gsl_matrix_view uv, vv;
2210
- gsl_vector_view sv, bv, xv;
2211
- VALUE x;
2212
- if (argc != 4)
2213
- rb_raise(rb_eArgError, "Usage: SV.solve(u, v, s, b)");
2214
- GetNArray(argv[0], A);
2215
- uv = gsl_matrix_view_array(NA_PTR_TYPE(argv[0],double*), A->shape[1], A->shape[0]);
2216
- vv = gsl_matrix_view_array(NA_PTR_TYPE(argv[1],double*), A->shape[0], A->shape[0]);
2217
- sv = gsl_vector_view_array(NA_PTR_TYPE(argv[2],double*), A->shape[0]);
2218
- bv = gsl_vector_view_array(NA_PTR_TYPE(argv[3],double*), A->shape[0]);
2219
- x = na_make_object(NA_DFLOAT, 1, &(A->shape[0]), CLASS_OF(argv[3]));
2220
- xv = gsl_vector_view_array(NA_PTR_TYPE(x,double*), A->shape[0]);
2221
- gsl_linalg_SV_solve(&uv.matrix, &vv.matrix, &sv.vector, &bv.vector, &xv.vector);
2222
- return x;
2223
- }
2224
-
2225
- #endif
2226
-
2227
- static VALUE rb_gsl_linalg_SV_decomp(int argc, VALUE *argv, VALUE obj)
2228
- {
2229
- gsl_matrix *A = NULL, *V = NULL, *U = NULL;
2230
- gsl_vector *w = NULL, *S = NULL;
2231
- int flag = 1;
2232
- VALUE vs, vv, vu;
2233
- switch (TYPE(obj)) {
2234
- case T_MODULE: case T_CLASS: case T_OBJECT:
2235
- switch (argc) {
2236
- case 2:
2237
- CHECK_VECTOR(argv[1]);
2238
- Data_Get_Struct(argv[1], gsl_vector, w);
2239
- flag = 0;
2240
- /* no break, do next */
2241
- case 1:
2242
- #ifdef HAVE_NARRAY_H
2243
- if (NA_IsNArray(argv[0]))
2244
- return rb_gsl_linalg_SV_decomp_narray(argc, argv, obj);
2245
- #endif
2246
- CHECK_MATRIX(argv[0]);
2247
- Data_Get_Struct(argv[0], gsl_matrix, A);
2248
- break;
2249
- default:
2250
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
2251
- break;
2252
- }
2253
- break;
2254
- default:
2255
- switch (argc) {
2256
- case 0:
2257
- /* do nothing */
2258
- break;
2259
- case 1:
2260
- CHECK_VECTOR(argv[0]);
2261
- Data_Get_Struct(argv[0], gsl_vector, w);
2262
- flag = 0;
2263
- break;
2264
- default:
2265
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
2266
- break;
2267
- }
2268
- Data_Get_Struct(obj, gsl_matrix, A);
2269
- break;
2270
- }
2271
- U = make_matrix_clone(A);
2272
- S = gsl_vector_alloc(A->size2); /* see manual p 123 */
2273
- V = gsl_matrix_alloc(A->size2, A->size2);
2274
- if (flag == 1) w = gsl_vector_alloc(A->size2);
2275
- gsl_linalg_SV_decomp(U, V, S, w);
2276
- if (flag == 1) gsl_vector_free(w);
2277
- vu = Data_Wrap_Struct(cgsl_matrix_U, 0, gsl_matrix_free, U);
2278
- vv = Data_Wrap_Struct(cgsl_matrix_V, 0, gsl_matrix_free, V);
2279
- vs = Data_Wrap_Struct(cgsl_vector_S, 0, gsl_vector_free, S);
2280
- return rb_ary_new3(3, vu, vv, vs);
2281
- }
2282
-
2283
- static VALUE rb_gsl_linalg_SV_decomp_mod(int argc, VALUE *argv, VALUE obj)
2284
- {
2285
- gsl_matrix *A = NULL, *V = NULL, *U = NULL, *X = NULL;
2286
- gsl_vector *w = NULL, *S = NULL;
2287
- VALUE vs, vv, vu;
2288
- switch (TYPE(obj)) {
2289
- case T_MODULE: case T_CLASS: case T_OBJECT:
2290
- if (argc != 1) rb_raise(rb_eArgError,
2291
- "wrong number of argument (%d for 1)", argc);
2292
- CHECK_MATRIX(argv[0]);
2293
- Data_Get_Struct(argv[0], gsl_matrix, A);
2294
- break;
2295
- default:
2296
- Data_Get_Struct(obj, gsl_matrix, A);
2297
- break;
2298
- }
2299
- U = make_matrix_clone(A);
2300
- S = gsl_vector_alloc(A->size2); /* see manual p 123 */
2301
- V = gsl_matrix_alloc(A->size2, A->size2);
2302
- X = gsl_matrix_alloc(A->size2, A->size2);
2303
- w = gsl_vector_alloc(A->size2);
2304
- gsl_linalg_SV_decomp_mod(U, X, V, S, w);
2305
- gsl_vector_free(w);
2306
- gsl_matrix_free(X);
2307
- vu = Data_Wrap_Struct(cgsl_matrix_U, 0, gsl_matrix_free, U);
2308
- vv = Data_Wrap_Struct(cgsl_matrix_V, 0, gsl_matrix_free, V);
2309
- vs = Data_Wrap_Struct(cgsl_vector_S, 0, gsl_vector_free, S);
2310
- return rb_ary_new3(3, vu, vv, vs);
2311
- }
2312
-
2313
- static VALUE rb_gsl_linalg_SV_decomp_jacobi(int argc, VALUE *argv, VALUE obj)
2314
- {
2315
- gsl_matrix *A = NULL, *V = NULL, *U = NULL;
2316
- gsl_vector *S = NULL;
2317
- VALUE vs, vv, vu;
2318
- switch (TYPE(obj)) {
2319
- case T_MODULE: case T_CLASS: case T_OBJECT:
2320
- if (argc != 1) rb_raise(rb_eArgError,
2321
- "wrong number of argument (%d for 1)", argc);
2322
- #ifdef HAVE_NARRAY_H
2323
- if (NA_IsNArray(argv[0]))
2324
- return rb_gsl_linalg_SV_decomp_jacobi_narray(argc, argv, obj);
2325
- #endif
2326
- CHECK_MATRIX(argv[0]);
2327
- Data_Get_Struct(argv[0], gsl_matrix, A);
2328
- break;
2329
- default:
2330
- Data_Get_Struct(obj, gsl_matrix, A);
2331
- break;
2332
- }
2333
- U = make_matrix_clone(A);
2334
- S = gsl_vector_alloc(A->size2); /* see manual p 123 */
2335
- V = gsl_matrix_alloc(A->size2, A->size2);
2336
- gsl_linalg_SV_decomp_jacobi(U, V, S);
2337
- vu = Data_Wrap_Struct(cgsl_matrix_U, 0, gsl_matrix_free, U);
2338
- vv = Data_Wrap_Struct(cgsl_matrix_V, 0, gsl_matrix_free, V);
2339
- vs = Data_Wrap_Struct(cgsl_vector_S, 0, gsl_vector_free, S);
2340
- return rb_ary_new3(3, vu, vv, vs);
2341
- }
2342
-
2343
- static VALUE rb_gsl_linalg_SV_solve(int argc, VALUE *argv, VALUE obj)
2344
- {
2345
- gsl_matrix *A = NULL, *U = NULL, *V = NULL;
2346
- gsl_vector *S = NULL, *b = NULL, *x = NULL;
2347
- int flagb = 0, flagv = 0;
2348
-
2349
- switch (TYPE(obj)) {
2350
- case T_MODULE: case T_CLASS: case T_OBJECT:
2351
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
2352
- #ifdef HAVE_NARRAY_H
2353
- if (NA_IsNArray(argv[0]))
2354
- return rb_gsl_linalg_SV_solve_narray(argc, argv, obj);
2355
- #endif
2356
-
2357
- CHECK_MATRIX(argv[0]);
2358
- if (CLASS_OF(argv[0]) == cgsl_matrix_U) {
2359
- if (argc != 4) rb_raise(rb_eArgError,
2360
- "wrong number of arguments (%d for 4)", argc);
2361
- Data_Get_Struct(argv[0], gsl_matrix, U);
2362
- CHECK_MATRIX(argv[1]);
2363
- if (CLASS_OF(argv[1]) != cgsl_matrix_V)
2364
- rb_raise(rb_eTypeError, "not a V matrix");
2365
- Data_Get_Struct(argv[1], gsl_matrix, V);
2366
- CHECK_VECTOR(argv[2]);
2367
- if (CLASS_OF(argv[2]) != cgsl_vector_S)
2368
- rb_raise(rb_eTypeError, "not a S vector");
2369
- Data_Get_Struct(argv[2], gsl_vector, S);
2370
- if (TYPE(argv[3]) == T_ARRAY) {
2371
- b = make_cvector_from_rarray(argv[3]);
2372
- flagb = 1;
2373
- } else {
2374
- CHECK_VECTOR(argv[3]);
2375
- Data_Get_Struct(argv[3], gsl_vector, b);
2376
- }
2377
- } else {
2378
- if (argc != 2) rb_raise(rb_eArgError,
2379
- "wrong number of arguments (%d for 2)", argc);
2380
- Data_Get_Struct(argv[0], gsl_matrix, A);
2381
- U = make_matrix_clone(A);
2382
- if (TYPE(argv[1]) == T_ARRAY) {
2383
- b = make_cvector_from_rarray(argv[1]);
2384
- flagb = 1;
2385
- } else {
2386
- CHECK_VECTOR(argv[1]);
2387
- Data_Get_Struct(argv[1], gsl_vector, b);
2388
- }
2389
- S = gsl_vector_alloc(A->size2); /* see manual p 123 */
2390
- V = gsl_matrix_alloc(A->size2, A->size2);
2391
- gsl_linalg_SV_decomp_jacobi(U, V, S);
2392
- flagv = 1;
2393
- }
2394
- break;
2395
- default:
2396
- if (argc != 1) rb_raise(rb_eArgError,
2397
- "wrong number of arguments (%d for 1)", argc);
2398
- Data_Get_Struct(obj, gsl_matrix, A);
2399
- U = make_matrix_clone(A);
2400
- if (TYPE(argv[0]) == T_ARRAY) {
2401
- b = make_cvector_from_rarray(argv[0]);
2402
- flagb = 1;
2403
- } else {
2404
- CHECK_VECTOR(argv[0]);
2405
- Data_Get_Struct(argv[0], gsl_vector, b);
2406
- }
2407
- S = gsl_vector_alloc(A->size2); /* see manual p 123 */
2408
- V = gsl_matrix_alloc(A->size2, A->size2);
2409
- gsl_linalg_SV_decomp_jacobi(U, V, S);
2410
- flagv = 1;
2411
- break;
2412
- }
2413
- // x = gsl_vector_alloc(b->size);
2414
- // Bug report #25842
2415
- x = gsl_vector_alloc(S->size);
2416
- gsl_linalg_SV_solve(U, V, S, b, x);
2417
- if (flagv == 1) {
2418
- gsl_matrix_free(U);
2419
- gsl_matrix_free(V);
2420
- gsl_vector_free(S);
2421
- }
2422
- if (flagb == 1) gsl_vector_free(b);
2423
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
2424
- }
2425
-
2426
- /*****/
2427
-
2428
- #ifdef HAVE_NARRAY_H
2429
- static VALUE rb_gsl_linalg_cholesky_decomp_narray(int argc, VALUE *argv, VALUE obj)
2430
- {
2431
- struct NARRAY *na;
2432
- VALUE chol;
2433
- gsl_matrix_view mv;
2434
- GetNArray(argv[0], na);
2435
- chol = na_make_object(NA_DFLOAT, 2, na->shape, CLASS_OF(argv[0]));
2436
- memcpy(NA_PTR_TYPE(chol,double*), (double*)na->ptr, sizeof(double)*na->total);
2437
- mv = gsl_matrix_view_array(NA_PTR_TYPE(chol,double*), na->shape[1], na->shape[0]);
2438
- gsl_linalg_cholesky_decomp(&mv.matrix);
2439
- return chol;
2440
- }
2441
-
2442
- static VALUE rb_gsl_linalg_cholesky_solve_narray(int argc, VALUE *argv, VALUE obj)
2443
- {
2444
- struct NARRAY *nm, *nb;
2445
- VALUE x;
2446
- gsl_matrix_view mv;
2447
- gsl_vector_view bv, xv;
2448
- switch (argc) {
2449
- case 2:
2450
- GetNArray(argv[0], nm);
2451
- GetNArray(argv[1], nb);
2452
- x = na_make_object(NA_DFLOAT, 1, nb->shape, CLASS_OF(argv[1]));
2453
- break;
2454
- case 3:
2455
- GetNArray(argv[0], nm);
2456
- GetNArray(argv[1], nb);
2457
- x = argv[2];
2458
- break;
2459
- default:
2460
- rb_raise(rb_eArgError,
2461
- "Usage: Cholesky.solve(chol, b) or Cholesky.solve(chol, b, x)");
2462
- break;
2463
- }
2464
- mv = gsl_matrix_view_array((double*)nm->ptr, nm->shape[1], nm->shape[0]);
2465
- bv = gsl_vector_view_array((double*)nb->ptr, nb->shape[0]);
2466
- xv = gsl_vector_view_array(NA_PTR_TYPE(x,double*), nb->shape[0]);
2467
- gsl_linalg_cholesky_solve(&mv.matrix, &bv.vector, &xv.vector);
2468
- return x;
2469
- }
2470
-
2471
- static VALUE rb_gsl_linalg_cholesky_svx_narray(int argc, VALUE *argv, VALUE obj)
2472
- {
2473
- struct NARRAY *nm, *nb;
2474
- gsl_matrix_view mv;
2475
- gsl_vector_view bv;
2476
- GetNArray(argv[0], nm); GetNArray(argv[1], nb);
2477
- mv = gsl_matrix_view_array((double*)nm->ptr, nm->shape[1], nm->shape[0]);
2478
- bv = gsl_vector_view_array((double*)nb->ptr, nb->shape[0]);
2479
- gsl_linalg_cholesky_svx(&mv.matrix, &bv.vector);
2480
- return argv[1];
2481
- }
2482
-
2483
- #endif
2484
-
2485
- static VALUE rb_gsl_linalg_cholesky_decomp(int argc, VALUE *argv, VALUE obj)
2486
- {
2487
- gsl_matrix *A = NULL, *Atmp = NULL;
2488
- switch(TYPE(obj)) {
2489
- case T_MODULE: case T_CLASS: case T_OBJECT:
2490
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2491
- argc);
2492
- #ifdef HAVE_NARRAY_H
2493
- if (NA_IsNArray(argv[0]))
2494
- return rb_gsl_linalg_cholesky_decomp_narray(argc, argv, obj);
2495
- #endif
2496
- CHECK_MATRIX(argv[0]);
2497
- Data_Get_Struct(argv[0], gsl_matrix, Atmp);
2498
- break;
2499
- default:
2500
- CHECK_MATRIX(obj);
2501
- Data_Get_Struct(obj, gsl_matrix, Atmp);
2502
- break;
2503
- }
2504
- A = make_matrix_clone(Atmp);
2505
- gsl_linalg_cholesky_decomp(A);
2506
- return Data_Wrap_Struct(cgsl_matrix_C, 0, gsl_matrix_free, A);
2507
- }
2508
-
2509
- static VALUE rb_gsl_linalg_cholesky_solve(int argc, VALUE *argv, VALUE obj)
2510
- {
2511
- gsl_matrix *A = NULL, *Atmp = NULL;
2512
- gsl_vector *b = NULL, *x = NULL;
2513
- int flagb = 0, flaga = 0;
2514
- VALUE vA, vb;
2515
- switch(TYPE(obj)) {
2516
- case T_MODULE: case T_CLASS: case T_OBJECT:
2517
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
2518
- argc);
2519
- #ifdef HAVE_NARRAY_H
2520
- if (NA_IsNArray(argv[0]))
2521
- return rb_gsl_linalg_cholesky_solve_narray(argc, argv, obj);
2522
- #endif
2523
- vA = argv[0];
2524
- vb = argv[1];
2525
- break;
2526
- default:
2527
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2528
- argc);
2529
- vA = obj;
2530
- vb = argv[0];
2531
- break;
2532
- }
2533
- CHECK_MATRIX(vA);
2534
- Data_Get_Struct(vA, gsl_matrix, Atmp);
2535
- if (TYPE(vb) == T_ARRAY) {
2536
- b = make_cvector_from_rarray(vb);
2537
- flagb = 1;
2538
- } else {
2539
- CHECK_VECTOR(vb);
2540
- Data_Get_Struct(vb, gsl_vector, b);
2541
- }
2542
- if (CLASS_OF(vA) == cgsl_matrix_C) {
2543
- A = Atmp;
2544
- } else {
2545
- A = make_matrix_clone(Atmp);
2546
- flaga = 1;
2547
- gsl_linalg_cholesky_decomp(A);
2548
- }
2549
- x = gsl_vector_alloc(b->size);
2550
- gsl_linalg_cholesky_solve(A, b, x);
2551
- if (flaga == 1) gsl_matrix_free(A);
2552
- if (flagb == 1) gsl_vector_free(b);
2553
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
2554
- }
2555
-
2556
-
2557
- static VALUE rb_gsl_linalg_cholesky_svx(int argc, VALUE *argv, VALUE obj)
2558
- {
2559
- gsl_matrix *A = NULL, *Atmp = NULL;
2560
- gsl_vector *b = NULL;
2561
- int flaga = 0;
2562
- VALUE vA, vb;
2563
- switch(TYPE(obj)) {
2564
- case T_MODULE: case T_CLASS: case T_OBJECT:
2565
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
2566
- argc);
2567
- #ifdef HAVE_NARRAY_H
2568
- if (NA_IsNArray(argv[0]))
2569
- return rb_gsl_linalg_cholesky_svx_narray(argc, argv, obj);
2570
- #endif
2571
- vA = argv[0];
2572
- vb = argv[1];
2573
- break;
2574
- default:
2575
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2576
- argc);
2577
- vA = obj;
2578
- vb = argv[0];
2579
- break;
2580
- }
2581
- CHECK_MATRIX(vA);
2582
- Data_Get_Struct(vA, gsl_matrix, Atmp);
2583
- CHECK_VECTOR(vb);
2584
- Data_Get_Struct(vb, gsl_vector, b);
2585
- if (CLASS_OF(vA) == cgsl_matrix_C) {
2586
- A = Atmp;
2587
- } else {
2588
- A = make_matrix_clone(Atmp);
2589
- flaga = 1;
2590
- gsl_linalg_cholesky_decomp(A);
2591
- }
2592
- gsl_linalg_cholesky_svx(A, b);
2593
- if (flaga == 1) gsl_matrix_free(A);
2594
- return vb;
2595
- }
2596
-
2597
- static VALUE rb_gsl_linalg_symmtd_decomp(int argc, VALUE *argv, VALUE obj)
2598
- {
2599
- gsl_matrix *A = NULL, *Atmp = NULL;
2600
- gsl_vector *tau = NULL;
2601
- VALUE vQ, vtau;
2602
- switch (TYPE(obj)) {
2603
- case T_MODULE: case T_CLASS: case T_OBJECT:
2604
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2605
- argc);
2606
- CHECK_MATRIX(argv[0]);
2607
- Data_Get_Struct(argv[0], gsl_matrix, Atmp);
2608
- break;
2609
- default:
2610
- CHECK_MATRIX(obj);
2611
- Data_Get_Struct(obj, gsl_matrix, Atmp);
2612
- break;
2613
- }
2614
- A = make_matrix_clone(Atmp);
2615
- tau = gsl_vector_alloc(A->size1);
2616
- gsl_linalg_symmtd_decomp(A, tau);
2617
- vQ = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, A);
2618
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
2619
- return rb_ary_new3(2, vQ, vtau);
2620
- }
2621
-
2622
-
2623
- static VALUE rb_gsl_linalg_symmtd_decomp2(int argc, VALUE *argv, VALUE obj)
2624
- {
2625
- gsl_matrix *A = NULL;
2626
- gsl_vector *tau = NULL;
2627
- switch (TYPE(obj)) {
2628
- case T_MODULE: case T_CLASS: case T_OBJECT:
2629
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2630
- argc);
2631
- CHECK_MATRIX(argv[0]);
2632
- Data_Get_Struct(argv[0], gsl_matrix, A);
2633
- break;
2634
- default:
2635
- CHECK_MATRIX(obj);
2636
- Data_Get_Struct(obj, gsl_matrix, A);
2637
- break;
2638
- }
2639
- tau = gsl_vector_alloc(A->size1);
2640
- gsl_linalg_symmtd_decomp(A, tau);
2641
- return Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
2642
- }
2643
-
2644
- static VALUE rb_gsl_linalg_symmtd_unpack(int argc, VALUE *argv, VALUE obj)
2645
- {
2646
- gsl_matrix *A = NULL, *Q = NULL;
2647
- gsl_vector *tau = NULL, *d = NULL, *sd = NULL;
2648
- VALUE vq, vd, vsd;
2649
- switch (TYPE(obj)) {
2650
- case T_MODULE: case T_CLASS: case T_OBJECT:
2651
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
2652
- argc);
2653
- CHECK_MATRIX(argv[0]);
2654
- Data_Get_Struct(argv[0], gsl_matrix, A);
2655
- Data_Get_Struct(argv[1], gsl_vector, tau);
2656
- break;
2657
- default:
2658
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2659
- argc);
2660
- CHECK_MATRIX(obj);
2661
- Data_Get_Struct(obj, gsl_matrix, A);
2662
- Data_Get_Struct(argv[0], gsl_vector, tau);
2663
- break;
2664
- }
2665
- Q = gsl_matrix_alloc(A->size1, A->size2);
2666
- d = gsl_vector_alloc(tau->size);
2667
- sd = gsl_vector_alloc(tau->size);
2668
- gsl_linalg_symmtd_unpack(A, tau, Q, d, sd);
2669
-
2670
- vq = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, Q);
2671
- vd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, d);
2672
- vsd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, sd);
2673
-
2674
- return rb_ary_new3(3, vq, vd, vsd);
2675
- }
2676
-
2677
- static VALUE rb_gsl_linalg_symmtd_unpack_T(int argc, VALUE *argv, VALUE obj)
2678
- {
2679
- gsl_matrix *A = NULL;
2680
- gsl_vector *d = NULL, *sd = NULL;
2681
- VALUE vd, vsd;
2682
- switch (TYPE(obj)) {
2683
- case T_MODULE: case T_CLASS: case T_OBJECT:
2684
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
2685
- argc);
2686
- CHECK_MATRIX(argv[0]);
2687
- Data_Get_Struct(argv[0], gsl_matrix, A);
2688
- break;
2689
- default:
2690
- Data_Get_Struct(obj, gsl_matrix, A);
2691
- break;
2692
- }
2693
- d = gsl_vector_alloc(A->size1);
2694
- sd = gsl_vector_alloc(A->size1);
2695
- gsl_linalg_symmtd_unpack_T(A, d, sd);
2696
-
2697
- vd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, d);
2698
- vsd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, sd);
2699
-
2700
- return rb_ary_new3(2, vd, vsd);
2701
- }
2702
-
2703
- /*****/
2704
-
2705
- static VALUE rb_gsl_linalg_hermtd_decomp(int argc, VALUE *argv, VALUE obj)
2706
- {
2707
- gsl_matrix_complex *A = NULL, *Atmp = NULL;
2708
- gsl_vector_complex *tau = NULL;
2709
- VALUE vQ, vtau;
2710
- switch (TYPE(obj)) {
2711
- case T_MODULE: case T_CLASS: case T_OBJECT:
2712
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2713
- argc);
2714
- CHECK_MATRIX_COMPLEX(argv[0]);
2715
- Data_Get_Struct(argv[0], gsl_matrix_complex, Atmp);
2716
- break;
2717
- default:
2718
- CHECK_MATRIX_COMPLEX(obj);
2719
- Data_Get_Struct(obj, gsl_matrix_complex, Atmp);
2720
- break;
2721
- }
2722
- A = make_matrix_complex_clone(Atmp);
2723
- tau = gsl_vector_complex_alloc(A->size1);
2724
- gsl_linalg_hermtd_decomp(A, tau);
2725
- vQ = Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, A);
2726
- vtau = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, tau);
2727
- return rb_ary_new3(2, vQ, vtau);
2728
- }
2729
-
2730
- static VALUE rb_gsl_linalg_hermtd_decomp2(int argc, VALUE *argv, VALUE obj)
2731
- {
2732
- gsl_matrix_complex *A = NULL;
2733
- gsl_vector_complex *tau = NULL;
2734
- switch (TYPE(obj)) {
2735
- case T_MODULE: case T_CLASS: case T_OBJECT:
2736
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2737
- argc);
2738
- CHECK_MATRIX_COMPLEX(argv[0]);
2739
- Data_Get_Struct(argv[0], gsl_matrix_complex, A);
2740
- break;
2741
- default:
2742
- CHECK_MATRIX_COMPLEX(obj);
2743
- Data_Get_Struct(obj, gsl_matrix_complex, A);
2744
- break;
2745
- }
2746
- tau = gsl_vector_complex_alloc(A->size1);
2747
- gsl_linalg_hermtd_decomp(A, tau);
2748
- return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, tau);
2749
- }
2750
-
2751
- static VALUE rb_gsl_linalg_hermtd_unpack(int argc, VALUE *argv, VALUE obj)
2752
- {
2753
- gsl_matrix_complex *A = NULL, *Q = NULL;
2754
- gsl_vector_complex *tau = NULL;
2755
- gsl_vector *d = NULL, *sd = NULL;
2756
- VALUE vq, vd, vsd;
2757
- switch (TYPE(obj)) {
2758
- case T_MODULE: case T_CLASS: case T_OBJECT:
2759
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2760
- argc);
2761
- CHECK_MATRIX_COMPLEX(argv[0]);
2762
- Data_Get_Struct(argv[0], gsl_matrix_complex, A);
2763
- Data_Get_Struct(argv[1], gsl_vector_complex, tau);
2764
- break;
2765
- default:
2766
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2767
- argc);
2768
- CHECK_MATRIX_COMPLEX(obj);
2769
- Data_Get_Struct(obj, gsl_matrix_complex, A);
2770
- Data_Get_Struct(argv[0], gsl_vector_complex, tau);
2771
- break;
2772
- }
2773
- Q = gsl_matrix_complex_alloc(A->size1, A->size2);
2774
- d = gsl_vector_alloc(tau->size);
2775
- sd = gsl_vector_alloc(tau->size);
2776
- gsl_linalg_hermtd_unpack(A, tau, Q, d, sd);
2777
-
2778
- vq = Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, Q);
2779
- vd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, d);
2780
- vsd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, sd);
2781
-
2782
- return rb_ary_new3(3, vq, vd, vsd);
2783
- }
2784
-
2785
- static VALUE rb_gsl_linalg_hermtd_unpack_T(int argc, VALUE *argv, VALUE obj)
2786
- {
2787
- gsl_matrix_complex *A = NULL;
2788
- gsl_vector *d = NULL, *sd = NULL;
2789
- VALUE vd, vsd;
2790
- switch (TYPE(obj)) {
2791
- case T_MODULE: case T_CLASS: case T_OBJECT:
2792
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
2793
- argc);
2794
- CHECK_MATRIX_COMPLEX(argv[0]);
2795
- Data_Get_Struct(argv[0], gsl_matrix_complex, A);
2796
- break;
2797
- default:
2798
- Data_Get_Struct(obj, gsl_matrix_complex, A);
2799
- break;
2800
- }
2801
- d = gsl_vector_alloc(A->size1);
2802
- sd = gsl_vector_alloc(A->size1);
2803
- gsl_linalg_hermtd_unpack_T(A, d, sd);
2804
-
2805
- vd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, d);
2806
- vsd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, sd);
2807
-
2808
- return rb_ary_new3(2, vd, vsd);
2809
- }
2810
-
2811
- /******/
2812
-
2813
- static VALUE rb_gsl_linalg_bidiag_decomp(int argc, VALUE *argv, VALUE obj)
2814
- {
2815
- gsl_matrix *A = NULL, *Atmp = NULL;
2816
- gsl_vector *tau_U = NULL, *tau_V = NULL;
2817
- size_t size0;
2818
- // local variable "status" was defined and set, but never used
2819
- //int status;
2820
- VALUE vu, vv, vA;
2821
-
2822
- switch (TYPE(obj)) {
2823
- case T_MODULE: case T_CLASS: case T_OBJECT:
2824
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
2825
- argc);
2826
- Data_Get_Struct(argv[0], gsl_matrix, Atmp);
2827
- break;
2828
- default:
2829
- Data_Get_Struct(obj, gsl_matrix, Atmp);
2830
- break;
2831
- }
2832
- A = make_matrix_clone(Atmp);
2833
- size0 = GSL_MIN(A->size1, A->size2);
2834
- tau_U = gsl_vector_alloc(size0);
2835
- tau_V = gsl_vector_alloc(size0-1);
2836
- /*status =*/ gsl_linalg_bidiag_decomp(A, tau_U, tau_V);
2837
- vA = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, A);
2838
- vu = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, tau_U);
2839
- vv = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, tau_V);
2840
- return rb_ary_new3(3, vA, vu, vv);
2841
- }
2842
-
2843
- static VALUE rb_gsl_linalg_bidiag_decomp2(int argc, VALUE *argv, VALUE obj)
2844
- {
2845
- gsl_matrix *A = NULL;
2846
- gsl_vector *tau_U = NULL, *tau_V = NULL;
2847
- size_t size0;
2848
- VALUE vu, vv;
2849
-
2850
- switch (TYPE(obj)) {
2851
- case T_MODULE: case T_CLASS: case T_OBJECT:
2852
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
2853
- argc);
2854
- Data_Get_Struct(argv[0], gsl_matrix, A);
2855
- break;
2856
- default:
2857
- Data_Get_Struct(obj, gsl_matrix, A);
2858
- break;
2859
- }
2860
- size0 = GSL_MIN(A->size1, A->size2);
2861
- tau_U = gsl_vector_alloc(size0);
2862
- tau_V = gsl_vector_alloc(size0-1);
2863
- gsl_linalg_bidiag_decomp(A, tau_U, tau_V);
2864
- vu = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, tau_U);
2865
- vv = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, tau_V);
2866
- return rb_ary_new3(2, vu, vv);
2867
- }
2868
-
2869
- static VALUE rb_gsl_linalg_bidiag_unpack(int argc, VALUE *argv, VALUE obj)
2870
- {
2871
- gsl_matrix *A = NULL, *U = NULL, *V = NULL;
2872
- gsl_vector *tau_U = NULL, *tau_V = NULL, *d = NULL, *s = NULL;
2873
- size_t size0;
2874
- VALUE vu, vv, vd, vs;
2875
-
2876
- switch (TYPE(obj)) {
2877
- case T_MODULE: case T_CLASS: case T_OBJECT:
2878
- if (argc != 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
2879
- argc);
2880
- CHECK_MATRIX(argv[0]);
2881
- CHECK_VECTOR(argv[1]);
2882
- CHECK_VECTOR(argv[2]);
2883
- Data_Get_Struct(argv[0], gsl_matrix, A);
2884
- Data_Get_Struct(argv[1], gsl_vector, tau_U);
2885
- Data_Get_Struct(argv[2], gsl_vector, tau_V);
2886
- break;
2887
- default:
2888
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
2889
- argc);
2890
- CHECK_MATRIX(obj);
2891
- CHECK_VECTOR(argv[0]);
2892
- CHECK_VECTOR(argv[1]);
2893
- Data_Get_Struct(obj, gsl_matrix, A);
2894
- Data_Get_Struct(argv[0], gsl_vector, tau_U);
2895
- Data_Get_Struct(argv[1], gsl_vector, tau_V);
2896
- break;
2897
- }
2898
- size0 = GSL_MIN(A->size1, A->size2);
2899
- U = gsl_matrix_alloc(A->size1, A->size2);
2900
- V = gsl_matrix_alloc(size0, size0);
2901
-
2902
- d = gsl_vector_alloc(size0);
2903
- s = gsl_vector_alloc(size0-1);
2904
- gsl_linalg_bidiag_unpack(A, tau_U, U, tau_V, V, d, s);
2905
- vu = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, U);
2906
- vv = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, V);
2907
- vd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, d);
2908
- vs = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, s);
2909
- return rb_ary_new3(4, vu, vv, vd, vs);
2910
- }
2911
-
2912
- static VALUE rb_gsl_linalg_bidiag_unpack2(int argc, VALUE *argv, VALUE obj)
2913
- {
2914
- gsl_matrix *A = NULL, *V = NULL;
2915
- gsl_vector *tau_V = NULL, *tau_U = NULL;
2916
- VALUE vv;
2917
-
2918
- switch (TYPE(obj)) {
2919
- case T_MODULE: case T_CLASS: case T_OBJECT:
2920
- if (argc != 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
2921
- argc);
2922
- CHECK_MATRIX(argv[0]);
2923
- CHECK_VECTOR(argv[1]);
2924
- CHECK_VECTOR(argv[2]);
2925
- Data_Get_Struct(argv[0], gsl_matrix, A);
2926
- Data_Get_Struct(argv[1], gsl_vector, tau_U);
2927
- Data_Get_Struct(argv[2], gsl_vector, tau_V);
2928
- break;
2929
- default:
2930
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
2931
- argc);
2932
- CHECK_MATRIX(obj);
2933
- CHECK_VECTOR(argv[0]);
2934
- CHECK_VECTOR(argv[1]);
2935
- Data_Get_Struct(obj, gsl_matrix, A);
2936
- Data_Get_Struct(argv[0], gsl_vector, tau_U);
2937
- Data_Get_Struct(argv[1], gsl_vector, tau_V);
2938
- break;
2939
- }
2940
- V = gsl_matrix_alloc(A->size2, A->size2);
2941
- gsl_linalg_bidiag_unpack2(A, tau_U, tau_V, V);
2942
- vv = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, V);
2943
- return vv;
2944
- }
2945
-
2946
- static VALUE rb_gsl_linalg_bidiag_unpack_B(int argc, VALUE *argv, VALUE obj)
2947
- {
2948
- gsl_matrix *A = NULL;
2949
- gsl_vector *d = NULL, *s = NULL;
2950
- size_t size0;
2951
- VALUE vd, vs;
2952
-
2953
- switch (TYPE(obj)) {
2954
- case T_MODULE: case T_CLASS: case T_OBJECT:
2955
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)",
2956
- argc);
2957
- CHECK_MATRIX(argv[0]);
2958
- Data_Get_Struct(argv[0], gsl_matrix, A);
2959
- break;
2960
- default:
2961
- CHECK_MATRIX(obj);
2962
- Data_Get_Struct(obj, gsl_matrix, A);
2963
- break;
2964
- }
2965
- size0 = GSL_MIN(A->size1, A->size2);
2966
- d = gsl_vector_alloc(size0);
2967
- s = gsl_vector_alloc(size0);
2968
- gsl_linalg_bidiag_unpack_B(A, d, s);
2969
- vd = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, d);
2970
- vs = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, s);
2971
- return rb_ary_new3(2, vd, vs);
2972
- }
2973
-
2974
- /* Householder Transformations 11.Jul.2004 */
2975
- static VALUE rb_gsl_linalg_householder_transform(int argc, VALUE *argv, VALUE obj)
2976
- {
2977
- gsl_vector *v = NULL;
2978
- switch (TYPE(obj)) {
2979
- case T_MODULE: case T_CLASS: case T_OBJECT:
2980
- if (argc < 1) rb_raise(rb_eArgError, "too few arguments.");
2981
- CHECK_VECTOR(argv[0]);
2982
- Data_Get_Struct(argv[0], gsl_vector, v);
2983
- break;
2984
- default:
2985
- Data_Get_Struct(obj, gsl_vector, v);
2986
- break;
2987
- }
2988
- return rb_float_new(gsl_linalg_householder_transform(v));
2989
- }
2990
-
2991
- /* singleton */
2992
- static VALUE rb_gsl_linalg_householder_hm(VALUE obj, VALUE t, VALUE vv, VALUE aa)
2993
- {
2994
- gsl_vector *v = NULL;
2995
- double tau;
2996
- gsl_matrix *A = NULL;
2997
- CHECK_VECTOR(vv);
2998
- CHECK_MATRIX(aa);
2999
- tau = NUM2DBL(t);
3000
- Data_Get_Struct(vv, gsl_vector, v);
3001
- Data_Get_Struct(aa, gsl_matrix, A);
3002
- gsl_linalg_householder_hm(tau, v, A);
3003
- return aa;
3004
- }
3005
-
3006
- static VALUE rb_gsl_linalg_householder_mh(VALUE obj, VALUE t, VALUE vv, VALUE aa)
3007
- {
3008
- gsl_vector *v = NULL;
3009
- double tau;
3010
- gsl_matrix *A = NULL;
3011
- CHECK_VECTOR(vv);
3012
- CHECK_MATRIX(aa);
3013
- tau = NUM2DBL(t);
3014
- Data_Get_Struct(vv, gsl_vector, v);
3015
- Data_Get_Struct(aa, gsl_matrix, A);
3016
- gsl_linalg_householder_mh(tau, v, A);
3017
- return aa;
3018
- }
3019
-
3020
- static VALUE rb_gsl_linalg_householder_hv(VALUE obj, VALUE t, VALUE vv, VALUE ww)
3021
- {
3022
- gsl_vector *v = NULL, *w = NULL;
3023
- double tau;
3024
- CHECK_VECTOR(vv);
3025
- CHECK_VECTOR(ww);
3026
- tau = NUM2DBL(t);
3027
- Data_Get_Struct(vv, gsl_vector, v);
3028
- Data_Get_Struct(ww, gsl_vector, w);
3029
- gsl_linalg_householder_hv(tau, v, w);
3030
- return ww;
3031
- }
3032
-
3033
- #ifdef HAVE_NARRAY_H
3034
- static VALUE rb_gsl_linalg_HH_solve_narray(int argc, VALUE *argv, VALUE obj)
3035
- {
3036
- struct NARRAY *na;
3037
- gsl_vector_view bv, xv;
3038
- VALUE x;
3039
- gsl_matrix *mtmp;
3040
- GetNArray(argv[0], na);
3041
- bv = gsl_vector_view_array(NA_PTR_TYPE(argv[1],double*), na->shape[1]);
3042
- x = na_make_object(NA_DFLOAT, 1, &na->shape[1], CLASS_OF(argv[1]));
3043
- xv = gsl_vector_view_array(NA_PTR_TYPE(x,double*), na->shape[1]);
3044
- mtmp = gsl_matrix_alloc(na->shape[1], na->shape[0]);
3045
- memcpy(mtmp->data, (double*)na->ptr, sizeof(double)*na->total);
3046
- gsl_linalg_HH_solve(mtmp, &bv.vector, &xv.vector);
3047
- gsl_matrix_free(mtmp);
3048
- return x;
3049
- }
3050
- static VALUE rb_gsl_linalg_HH_svx_narray(int argc, VALUE *argv, VALUE obj)
3051
- {
3052
- struct NARRAY *na;
3053
- gsl_matrix *mtmp;
3054
- gsl_vector_view bv;
3055
- GetNArray(argv[0], na);
3056
- bv = gsl_vector_view_array(NA_PTR_TYPE(argv[1],double*), na->shape[1]);
3057
- mtmp = gsl_matrix_alloc(na->shape[1], na->shape[0]);
3058
- memcpy(mtmp->data, (double*)na->ptr, sizeof(double)*na->total);
3059
- gsl_linalg_HH_svx(mtmp, &bv.vector);
3060
- gsl_matrix_free(mtmp);
3061
- return argv[1];
3062
- }
3063
- #endif
3064
-
3065
- /* 17.Apr.2004 */
3066
- static VALUE rb_gsl_linalg_HH_solve(int argc, VALUE *argv, VALUE obj)
3067
- {
3068
- gsl_matrix *A = NULL, *Atmp = NULL;
3069
- gsl_vector *b = NULL, *x = NULL;
3070
- int flagb = 0;
3071
- VALUE vA, vb;
3072
- switch (TYPE(obj)) {
3073
- case T_MODULE: case T_CLASS: case T_OBJECT:
3074
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
3075
- argc);
3076
- #ifdef HAVE_NARRAY_H
3077
- if (NA_IsNArray(argv[0]))
3078
- return rb_gsl_linalg_HH_solve_narray(argc, argv, obj);
3079
- #endif
3080
- vA = argv[0];
3081
- vb = argv[1];
3082
- break;
3083
- default:
3084
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
3085
- argc);
3086
- vA = obj;
3087
- vb = argv[0];
3088
- break;
3089
- }
3090
- CHECK_MATRIX(vA);
3091
- Data_Get_Struct(vA, gsl_matrix, Atmp);
3092
- if (TYPE(vb) == T_ARRAY) {
3093
- b = make_cvector_from_rarray(vb);
3094
- flagb = 1;
3095
- } else {
3096
- CHECK_VECTOR(vb);
3097
- Data_Get_Struct(vb, gsl_vector, b);
3098
- }
3099
- A = make_matrix_clone(Atmp);
3100
- x = gsl_vector_alloc(b->size);
3101
- gsl_linalg_HH_solve(A, b, x);
3102
- gsl_matrix_free(A);
3103
- if (flagb == 1) gsl_vector_free(b);
3104
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
3105
- }
3106
-
3107
- static VALUE rb_gsl_linalg_HH_solve_bang(int argc, VALUE *argv, VALUE obj)
3108
- {
3109
- gsl_matrix *A = NULL;
3110
- gsl_vector *b = NULL, *x = NULL;
3111
- int flagb = 0;
3112
- VALUE vA, vb;
3113
- switch (TYPE(obj)) {
3114
- case T_MODULE: case T_CLASS: case T_OBJECT:
3115
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
3116
- argc);
3117
- vA = argv[0];
3118
- vb = argv[1];
3119
- break;
3120
- default:
3121
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
3122
- argc);
3123
- vA = obj;
3124
- vb = argv[0];
3125
- break;
3126
- }
3127
- CHECK_MATRIX(vA);
3128
- Data_Get_Struct(vA, gsl_matrix, A);
3129
- if (TYPE(vb) == T_ARRAY) {
3130
- b = make_cvector_from_rarray(vb);
3131
- flagb = 1;
3132
- } else {
3133
- CHECK_VECTOR(vb);
3134
- Data_Get_Struct(vb, gsl_vector, b);
3135
- }
3136
- x = gsl_vector_alloc(b->size);
3137
- gsl_linalg_HH_solve(A, b, x);
3138
- if (flagb == 1) gsl_vector_free(b);
3139
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
3140
- }
3141
-
3142
- static VALUE rb_gsl_linalg_HH_svx(int argc, VALUE *argv, VALUE obj)
3143
- {
3144
- gsl_matrix *A = NULL, *Atmp = NULL;
3145
- gsl_vector *b = NULL;
3146
- VALUE vA, vb;
3147
- switch (TYPE(obj)) {
3148
- case T_MODULE: case T_CLASS: case T_OBJECT:
3149
- if (argc != 2) rb_raise(rb_eArgError, "wrong number of argument (%d for 2)",
3150
- argc);
3151
- #ifdef HAVE_NARRAY_H
3152
- if (NA_IsNArray(argv[0]))
3153
- return rb_gsl_linalg_HH_svx_narray(argc, argv, obj);
3154
- #endif
3155
- vA = argv[0];
3156
- vb = argv[1];
3157
- break;
3158
- default:
3159
- if (argc != 1) rb_raise(rb_eArgError, "wrong number of argument (%d for 1)",
3160
- argc);
3161
- vA = obj;
3162
- vb = argv[0];
3163
- break;
3164
- }
3165
- CHECK_MATRIX(vA);
3166
- Data_Get_Struct(vA, gsl_matrix, Atmp);
3167
- CHECK_VECTOR(vb);
3168
- Data_Get_Struct(vb, gsl_vector, b);
3169
- A = make_matrix_clone(Atmp);
3170
- gsl_linalg_HH_svx(A, b);
3171
- gsl_matrix_free(A);
3172
- return vb;
3173
- }
3174
-
3175
- static VALUE rb_gsl_linalg_solve_symm_tridiag(VALUE obj, VALUE dd, VALUE ee, VALUE bb)
3176
- {
3177
- gsl_vector *b = NULL, *x = NULL, *d = NULL, *e = NULL;
3178
-
3179
- Data_Get_Struct(dd, gsl_vector, d);
3180
- Data_Get_Struct(ee, gsl_vector, e);
3181
- Data_Get_Struct(bb, gsl_vector, b);
3182
- x = gsl_vector_alloc(b->size);
3183
-
3184
- gsl_linalg_solve_symm_tridiag(d, e, b, x);
3185
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
3186
- }
3187
-
3188
- static VALUE rb_gsl_linalg_solve_tridiag(VALUE obj, VALUE dd, VALUE ee, VALUE ff,
3189
- VALUE bb)
3190
- {
3191
- gsl_vector *b = NULL, *x = NULL, *d = NULL, *e = NULL, *f = NULL;
3192
-
3193
- Data_Get_Struct(dd, gsl_vector, d);
3194
- Data_Get_Struct(ee, gsl_vector, e);
3195
- Data_Get_Struct(ff, gsl_vector, f);
3196
- Data_Get_Struct(bb, gsl_vector, b);
3197
- x = gsl_vector_alloc(b->size);
3198
-
3199
- gsl_linalg_solve_tridiag(d, e, f, b, x);
3200
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
3201
- }
3202
-
3203
- static VALUE rb_gsl_linalg_solve_symm_cyc_tridiag(VALUE obj, VALUE dd, VALUE ee, VALUE bb)
3204
- {
3205
- gsl_vector *b = NULL, *x = NULL, *d = NULL, *e = NULL;
3206
-
3207
- Data_Get_Struct(dd, gsl_vector, d);
3208
- Data_Get_Struct(ee, gsl_vector, e);
3209
- Data_Get_Struct(bb, gsl_vector, b);
3210
- x = gsl_vector_alloc(b->size);
3211
-
3212
- gsl_linalg_solve_symm_cyc_tridiag(d, e, b, x);
3213
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
3214
- }
3215
-
3216
- static VALUE rb_gsl_linalg_solve_cyc_tridiag(VALUE obj, VALUE dd, VALUE ee,
3217
- VALUE ff, VALUE bb)
3218
- {
3219
- gsl_vector *b = NULL, *x = NULL, *d = NULL, *e = NULL, *f = NULL;
3220
- Data_Get_Struct(dd, gsl_vector, d);
3221
- Data_Get_Struct(ee, gsl_vector, e);
3222
- Data_Get_Struct(ff, gsl_vector, f);
3223
- Data_Get_Struct(bb, gsl_vector, b);
3224
- x = gsl_vector_alloc(b->size);
3225
- gsl_linalg_solve_cyc_tridiag(d, e, f, b, x);
3226
- return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, x);
3227
- }
3228
-
3229
- static void rb_gsl_linalg_balance_columns_init(int argc, VALUE *argv, VALUE obj,
3230
- VALUE *mat, VALUE *vec,
3231
- gsl_matrix **M, gsl_vector **V)
3232
- {
3233
- gsl_matrix *A = NULL;
3234
- gsl_vector *D = NULL;
3235
- switch (TYPE(obj)) {
3236
- case T_MODULE: case T_CLASS: case T_OBJECT:
3237
- switch (argc) {
3238
- case 2:
3239
- CHECK_MATRIX(argv[0]); CHECK_VECTOR(argv[1]);
3240
- Data_Get_Struct(argv[0], gsl_matrix, A);
3241
- Data_Get_Struct(argv[1], gsl_vector, D);
3242
- *vec = argv[1];
3243
- break;
3244
- case 1:
3245
- CHECK_MATRIX(argv[0]);
3246
- Data_Get_Struct(argv[0], gsl_matrix, A);
3247
- D = gsl_vector_alloc(A->size2);
3248
- *vec = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
3249
- break;
3250
- default:
3251
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
3252
- break;
3253
- }
3254
- *mat = argv[0];
3255
- break;
3256
- default:
3257
- Data_Get_Struct(obj, gsl_matrix, A);
3258
- switch (argc) {
3259
- case 1:
3260
- CHECK_VECTOR(argv[0]);
3261
- Data_Get_Struct(argv[0], gsl_vector, D);
3262
- *vec = argv[0];
3263
- break;
3264
- case 0:
3265
- D = gsl_vector_alloc(A->size2);
3266
- *vec = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
3267
- break;
3268
- default:
3269
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
3270
- break;
3271
- }
3272
- *mat = obj;
3273
- break;
3274
- }
3275
- *M = A;
3276
- *V = D;
3277
- }
3278
-
3279
- static VALUE rb_gsl_linalg_balance_columns_bang(int argc, VALUE *argv, VALUE obj)
3280
- {
3281
- gsl_matrix *A = NULL;
3282
- gsl_vector *D = NULL;
3283
- VALUE mat, vec;
3284
- // local variable "status" was defined and set, but never used
3285
- //int status;
3286
- rb_gsl_linalg_balance_columns_init(argc, argv, obj, &mat, &vec, &A, &D);
3287
- /*status =*/ gsl_linalg_balance_columns(A, D);
3288
- return rb_ary_new3(2, mat, vec);
3289
- }
3290
-
3291
- static VALUE rb_gsl_linalg_balance_columns(int argc, VALUE *argv, VALUE obj)
3292
- {
3293
- gsl_matrix *A = NULL, *Anew;
3294
- gsl_vector *D = NULL;
3295
- VALUE mat, vec;
3296
- // local variable "status" was defined and set, but never used
3297
- //int status;
3298
- rb_gsl_linalg_balance_columns_init(argc, argv, obj, &mat, &vec, &A, &D);
3299
- Anew = make_matrix_clone(A);
3300
- mat = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Anew);
3301
- /*status =*/ gsl_linalg_balance_columns(Anew, D);
3302
- return rb_ary_new3(2, mat, vec);
3303
- }
3304
-
3305
- static VALUE rb_gsl_linalg_hessenberg_decomp(VALUE module, VALUE AA)
3306
- {
3307
- gsl_matrix *A = NULL, *Atmp = NULL;
3308
- gsl_vector *tau = NULL;
3309
- VALUE vH, vtau;
3310
- CHECK_MATRIX(AA);
3311
- Data_Get_Struct(AA, gsl_matrix, Atmp);
3312
- A = make_matrix_clone(Atmp);
3313
- tau = gsl_vector_alloc(A->size1);
3314
- gsl_linalg_hessenberg_decomp(A, tau);
3315
- vH = Data_Wrap_Struct(cgsl_matrix_Q, 0, gsl_matrix_free, A);
3316
- vtau = Data_Wrap_Struct(cgsl_vector_tau, 0, gsl_vector_free, tau);
3317
- return rb_ary_new3(2, vH, vtau);
3318
- }
3319
-
3320
- static VALUE rb_gsl_linalg_hessenberg_unpack(VALUE module, VALUE HH, VALUE tt)
3321
- {
3322
- gsl_matrix *H = NULL, *U = NULL;
3323
- gsl_vector *tau = NULL;
3324
- CHECK_MATRIX(HH);
3325
- CHECK_VECTOR(tt);
3326
- Data_Get_Struct(HH, gsl_matrix, H);
3327
- Data_Get_Struct(tt, gsl_vector, tau);
3328
- U = gsl_matrix_alloc(H->size1, H->size2);
3329
- gsl_linalg_hessenberg_unpack(H, tau, U);
3330
-
3331
- return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, U);
3332
- }
3333
-
3334
- static VALUE rb_gsl_linalg_hessenberg_unpack_accum(int argc, VALUE *argv, VALUE module)
3335
- {
3336
- gsl_matrix *H = NULL, *V = NULL;
3337
- gsl_vector *tau = NULL;
3338
- size_t i;
3339
- VALUE val = Qnil;
3340
- switch (argc) {
3341
- case 2:
3342
- /* nothing to do */
3343
- break;
3344
- case 3:
3345
- CHECK_MATRIX(argv[2]);
3346
- Data_Get_Struct(argv[2], gsl_matrix, V);
3347
- val = argv[2];
3348
- break;
3349
- default:
3350
- rb_raise(rb_eArgError, "Wrong number of arguments (%d for 2 or 3)", argc);
3351
- }
3352
- CHECK_MATRIX(argv[0]);
3353
- CHECK_VECTOR(argv[1]);
3354
- Data_Get_Struct(argv[0], gsl_matrix, H);
3355
- Data_Get_Struct(argv[1], gsl_vector, tau);
3356
- if (argc == 2) {
3357
- V = gsl_matrix_alloc(H->size1, H->size2);
3358
- val = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, V);
3359
- for (i = 0; i < V->size1; i++) gsl_matrix_set(V, i, i, 1.0);
3360
- }
3361
- gsl_linalg_hessenberg_unpack_accum(H, tau, V);
3362
- return val;
3363
- }
3364
- static VALUE rb_gsl_linalg_hessenberg_set_zero(VALUE module, VALUE HH)
3365
- {
3366
- gsl_matrix *H;
3367
- CHECK_MATRIX(HH);
3368
- Data_Get_Struct(HH, gsl_matrix, H);
3369
- return INT2FIX(gsl_linalg_hessenberg_set_zero(H));
3370
- /* gsl_linalg_hessenberg_set_zero(H);
3371
- return INT2FIX(0);*/
3372
- }
3373
- static VALUE rb_gsl_linalg_hesstri_decomp(int argc, VALUE *argv, VALUE module)
3374
- {
3375
- gsl_matrix *A = NULL, *B = NULL, *Anew, *Bnew;
3376
- gsl_matrix *U = NULL, *V = NULL;
3377
- gsl_vector *work = NULL;
3378
- VALUE vH, vR, vU = Qnil, vV = Qnil, ary;
3379
- int flag = 0;
3380
- switch (argc) {
3381
- case 2:
3382
- flag = 1;
3383
- break;
3384
- case 3:
3385
- CHECK_VECTOR(argv[2]);
3386
- Data_Get_Struct(argv[2], gsl_vector, work);
3387
- break;
3388
- case 4:
3389
- CHECK_MATRIX(argv[2]);
3390
- CHECK_MATRIX(argv[3]);
3391
- Data_Get_Struct(argv[2], gsl_matrix, U);
3392
- Data_Get_Struct(argv[3], gsl_matrix, V);
3393
- flag = 1;
3394
- break;
3395
- case 5:
3396
- CHECK_MATRIX(argv[2]);
3397
- CHECK_MATRIX(argv[3]);
3398
- CHECK_VECTOR(argv[4]);
3399
- Data_Get_Struct(argv[2], gsl_matrix, U);
3400
- Data_Get_Struct(argv[3], gsl_matrix, V);
3401
- Data_Get_Struct(argv[4], gsl_vector, work);
3402
- vU = argv[2];
3403
- vV = argv[3];
3404
- break;
3405
- default:
3406
- rb_raise(rb_eArgError, "Wrong number of arguments (%d for 2-55)", argc);
3407
- }
3408
- CHECK_MATRIX(argv[0]);
3409
- CHECK_MATRIX(argv[1]);
3410
- Data_Get_Struct(argv[0], gsl_matrix, A);
3411
- Data_Get_Struct(argv[1], gsl_matrix, B);
3412
- Anew = make_matrix_clone(A);
3413
- Bnew = make_matrix_clone(B);
3414
- if (flag == 1) work = gsl_vector_alloc(A->size1);
3415
- gsl_linalg_hesstri_decomp(Anew, Bnew, U, V, work);
3416
- if (flag == 1) gsl_vector_free(work);
3417
- vH = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Anew);
3418
- vR = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Bnew);
3419
- if (argc == 2 || argc == 3) {
3420
- ary = rb_ary_new3(2, vH, vR);
3421
- } else {
3422
- ary = rb_ary_new3(4, vH, vR, vU, vV);
3423
- }
3424
- return ary;
3425
- }
3426
- static VALUE rb_gsl_linalg_hesstri_decomp_bang(int argc, VALUE *argv, VALUE module)
3427
- {
3428
- gsl_matrix *A = NULL, *B = NULL;
3429
- gsl_matrix *U = NULL, *V = NULL;
3430
- gsl_vector *work = NULL;
3431
- VALUE vH, vR, vU = Qnil, vV = Qnil, ary;
3432
- int flag = 0;
3433
- switch (argc) {
3434
- case 2:
3435
- flag = 1;
3436
- break;
3437
- case 3:
3438
- CHECK_VECTOR(argv[2]);
3439
- Data_Get_Struct(argv[2], gsl_vector, work);
3440
- break;
3441
- case 4:
3442
- CHECK_MATRIX(argv[2]);
3443
- CHECK_MATRIX(argv[3]);
3444
- Data_Get_Struct(argv[2], gsl_matrix, U);
3445
- Data_Get_Struct(argv[3], gsl_matrix, V);
3446
- flag = 1;
3447
- break;
3448
- case 5:
3449
- CHECK_MATRIX(argv[2]);
3450
- CHECK_MATRIX(argv[3]);
3451
- CHECK_VECTOR(argv[4]);
3452
- Data_Get_Struct(argv[2], gsl_matrix, U);
3453
- Data_Get_Struct(argv[3], gsl_matrix, V);
3454
- Data_Get_Struct(argv[4], gsl_vector, work);
3455
- vU = argv[2];
3456
- vV = argv[3];
3457
- break;
3458
- default:
3459
- rb_raise(rb_eArgError, "Wrong number of arguments (%d for 2-55)", argc);
3460
- }
3461
- CHECK_MATRIX(argv[0]);
3462
- CHECK_MATRIX(argv[1]);
3463
- Data_Get_Struct(argv[0], gsl_matrix, A);
3464
- Data_Get_Struct(argv[1], gsl_matrix, B);
3465
- if (flag == 1) work = gsl_vector_alloc(A->size1);
3466
- gsl_linalg_hesstri_decomp(A, B, U, V, work);
3467
- if (flag == 1) gsl_vector_free(work);
3468
- vH = argv[0];
3469
- vR = argv[1];
3470
- if (argc == 2 || argc == 3) {
3471
- ary = rb_ary_new3(2, vH, vR);
3472
- } else {
3473
- ary = rb_ary_new3(4, vH, vR, vU, vV);
3474
- }
3475
- return ary;
3476
- }
3477
-
3478
- static VALUE rb_gsl_linalg_balance_matrix(int argc, VALUE *argv, VALUE module)
3479
- {
3480
- gsl_matrix *A, *Anew;
3481
- gsl_vector *D;
3482
- VALUE vA, vD;
3483
- switch (argc) {
3484
- case 1:
3485
- CHECK_MATRIX(argv[0]);
3486
- Data_Get_Struct(argv[0], gsl_matrix, A);
3487
- Anew = make_matrix_clone(A);
3488
- D = gsl_vector_alloc(A->size1);
3489
- vD = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
3490
- break;
3491
- case 2:
3492
- CHECK_MATRIX(argv[0]);
3493
- CHECK_VECTOR(argv[1]);
3494
- Data_Get_Struct(argv[0], gsl_matrix, A);
3495
- Data_Get_Struct(argv[1], gsl_vector, D);
3496
- Anew = make_matrix_clone(A);
3497
- vD = argv[1];
3498
- break;
3499
- default:
3500
- rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
3501
- }
3502
- gsl_linalg_balance_matrix(Anew, D);
3503
- vA = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, Anew);
3504
- return rb_ary_new3(2, vA, vD);
3505
-
3506
- }
3507
- static VALUE rb_gsl_linalg_balance_matrix2(int argc, VALUE *argv, VALUE module)
3508
- {
3509
- gsl_matrix *A;
3510
- gsl_vector *D;
3511
- switch (argc) {
3512
- case 1:
3513
- CHECK_MATRIX(argv[0]);
3514
- Data_Get_Struct(argv[0], gsl_matrix, A);
3515
- D = gsl_vector_alloc(A->size1);
3516
- gsl_linalg_balance_matrix(A, D);
3517
- return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, D);
3518
- break;
3519
- case 2:
3520
- CHECK_MATRIX(argv[0]);
3521
- CHECK_VECTOR(argv[1]);
3522
- Data_Get_Struct(argv[0], gsl_matrix, A);
3523
- Data_Get_Struct(argv[1], gsl_vector, D);
3524
- return INT2FIX(gsl_linalg_balance_matrix(A, D));
3525
- break;
3526
- default:
3527
- rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
3528
- }
3529
- return Qtrue;
3530
- }
3531
-
3532
- void Init_gsl_linalg_complex(VALUE module);
3533
- void Init_gsl_linalg(VALUE module)
3534
- {
3535
- VALUE mgsl_linalg;
3536
- VALUE mgsl_linalg_LU;
3537
- VALUE mgsl_linalg_QR;
3538
- VALUE mgsl_linalg_QRPT;
3539
- VALUE mgsl_linalg_LQ;
3540
- VALUE mgsl_linalg_PTLQ;
3541
- VALUE mgsl_linalg_SV;
3542
- VALUE mgsl_linalg_cholesky;
3543
- VALUE mgsl_linalg_symmtd;
3544
- VALUE mgsl_linalg_hermtd;
3545
- VALUE mgsl_linalg_bidiag;
3546
- VALUE mgsl_linalg_tridiag;
3547
- VALUE mgsl_linalg_HH;
3548
- VALUE mgsl_linalg_Householder;
3549
- VALUE mhessen;
3550
-
3551
- mgsl_linalg = rb_define_module_under(module, "Linalg");
3552
- mgsl_linalg_LU = rb_define_module_under(mgsl_linalg, "LU");
3553
- cgsl_matrix_LU = rb_define_class_under(mgsl_linalg_LU, "LUMatrix", cgsl_matrix);
3554
- mgsl_linalg_QR = rb_define_module_under(mgsl_linalg, "QR");
3555
- mgsl_linalg_QRPT = rb_define_module_under(mgsl_linalg, "QRPT");
3556
- cgsl_matrix_QR = rb_define_class_under(mgsl_linalg, "QRMatrix", cgsl_matrix);
3557
- cgsl_matrix_QRPT = rb_define_class_under(mgsl_linalg, "QRPTMatrix", cgsl_matrix);
3558
- cgsl_vector_tau = rb_define_class_under(mgsl_linalg, "TauVector", cgsl_vector);
3559
- cgsl_matrix_Q = rb_define_class_under(mgsl_linalg, "QMatrix", cgsl_matrix);
3560
- cgsl_matrix_R = rb_define_class_under(mgsl_linalg, "RMatrix", cgsl_matrix);
3561
-
3562
- mgsl_linalg_LQ = rb_define_module_under(mgsl_linalg, "LQ");
3563
- mgsl_linalg_PTLQ = rb_define_module_under(mgsl_linalg, "PTLQ");
3564
- cgsl_matrix_LQ = rb_define_class_under(mgsl_linalg, "LQMatrix", cgsl_matrix);
3565
- cgsl_matrix_PTLQ = rb_define_class_under(mgsl_linalg, "PTLQMatrix", cgsl_matrix);
3566
- cgsl_matrix_L = rb_define_class_under(mgsl_linalg, "LMatrix", cgsl_matrix);
3567
-
3568
- /*****/
3569
- mgsl_linalg_SV = rb_define_module_under(mgsl_linalg, "SV");
3570
- cgsl_matrix_SV = rb_define_class_under(mgsl_linalg_SV, "SVMatrix", cgsl_matrix);
3571
- cgsl_matrix_U = rb_define_class_under(mgsl_linalg_SV, "UMatrix", cgsl_matrix);
3572
- cgsl_matrix_V = rb_define_class_under(mgsl_linalg_SV, "VMatrix", cgsl_matrix);
3573
- cgsl_vector_S = rb_define_class_under(mgsl_linalg_SV, "SingularValues", cgsl_vector);
3574
-
3575
- /*****/
3576
- mgsl_linalg_cholesky = rb_define_module_under(mgsl_linalg, "Cholesky");
3577
- cgsl_matrix_C = rb_define_class_under(mgsl_linalg_cholesky, "CholeskyMatrix", cgsl_matrix);
3578
- mgsl_linalg_symmtd = rb_define_module_under(mgsl_linalg, "Symmtd");
3579
-
3580
- mgsl_linalg_hermtd = rb_define_module_under(mgsl_linalg, "Hermtd");
3581
- mgsl_linalg_bidiag = rb_define_module_under(mgsl_linalg, "Bidiag");
3582
- mgsl_linalg_tridiag = rb_define_module_under(mgsl_linalg, "Tridiag");
3583
-
3584
- mgsl_linalg_HH = rb_define_module_under(mgsl_linalg, "HH");
3585
- mgsl_linalg_Householder = rb_define_module_under(mgsl_linalg, "Householder");
3586
-
3587
- /*****/
3588
- rb_define_module_function(mgsl_linalg, "LU_decomp!", rb_gsl_linalg_LU_decomp_bang, -1);
3589
- rb_define_module_function(mgsl_linalg_LU, "decomp!", rb_gsl_linalg_LU_decomp_bang, -1);
3590
- rb_define_module_function(mgsl_linalg, "LU_decomp", rb_gsl_linalg_LU_decomp, -1);
3591
- rb_define_module_function(mgsl_linalg_LU, "decomp", rb_gsl_linalg_LU_decomp, -1);
3592
- rb_define_method(cgsl_matrix, "LU_decomp!", rb_gsl_linalg_LU_decomp_bang, -1);
3593
- rb_define_method(cgsl_matrix, "LU_decomp", rb_gsl_linalg_LU_decomp, -1);
3594
-
3595
- rb_define_module_function(mgsl_linalg, "LU_solve", rb_gsl_linalg_LU_solve, -1);
3596
- rb_define_module_function(mgsl_linalg_LU, "solve", rb_gsl_linalg_LU_solve, -1);
3597
- rb_define_method(cgsl_matrix, "LU_solve", rb_gsl_linalg_LU_solve, -1);
3598
- rb_define_method(cgsl_matrix_LU, "solve", rb_gsl_linalg_LU_solve, -1);
3599
-
3600
- rb_define_module_function(mgsl_linalg, "LU_svx", rb_gsl_linalg_LU_svx, -1);
3601
- rb_define_module_function(mgsl_linalg_LU, "svx", rb_gsl_linalg_LU_svx, -1);
3602
- rb_define_method(cgsl_matrix, "LU_svx", rb_gsl_linalg_LU_svx, -1);
3603
- rb_define_method(cgsl_matrix_LU, "svx", rb_gsl_linalg_LU_svx, -1);
3604
-
3605
- rb_define_module_function(mgsl_linalg, "LU_invert", rb_gsl_linalg_LU_invert, -1);
3606
- rb_define_module_function(mgsl_linalg_LU, "invert", rb_gsl_linalg_LU_invert, -1);
3607
- rb_define_module_function(mgsl_linalg_LU, "inv", rb_gsl_linalg_LU_invert, -1);
3608
- rb_define_module_function(mgsl_linalg_LU, "refine", rb_gsl_linalg_LU_refine, 5);
3609
-
3610
- rb_define_method(cgsl_matrix, "invert", rb_gsl_linalg_LU_invert, -1);
3611
- rb_define_alias(cgsl_matrix, "LU_invert", "invert");
3612
- rb_define_alias(cgsl_matrix, "inv", "invert");
3613
-
3614
- rb_define_module_function(mgsl_linalg, "LU_det", rb_gsl_linalg_LU_det, -1);
3615
- rb_define_module_function(mgsl_linalg_LU, "det", rb_gsl_linalg_LU_det, -1);
3616
- rb_define_method(cgsl_matrix, "LU_det", rb_gsl_linalg_LU_det, -1);
3617
- rb_define_alias(cgsl_matrix, "det", "LU_det");
3618
-
3619
- rb_define_module_function(mgsl_linalg, "LU_lndet", rb_gsl_linalg_LU_lndet, -1);
3620
- rb_define_module_function(mgsl_linalg_LU, "lndet", rb_gsl_linalg_LU_lndet, -1);
3621
- rb_define_method(cgsl_matrix, "LU_lndet", rb_gsl_linalg_LU_lndet, -1);
3622
- rb_define_alias(cgsl_matrix, "lndet", "LU_lndet");
3623
-
3624
- rb_define_module_function(mgsl_linalg, "LU_sgndet", rb_gsl_linalg_LU_sgndet, -1);
3625
- rb_define_module_function(mgsl_linalg_LU, "sgndet", rb_gsl_linalg_LU_sgndet, -1);
3626
- rb_define_method(cgsl_matrix, "LU_sgndet", rb_gsl_linalg_LU_sgndet, -1);
3627
- rb_define_alias(cgsl_matrix, "sgndet", "LU_sgndet");
3628
-
3629
- /*****/
3630
- rb_define_module_function(mgsl_linalg, "QR_decomp", rb_gsl_linalg_QR_decomp, -1);
3631
- rb_define_module_function(mgsl_linalg_QR, "decomp", rb_gsl_linalg_QR_decomp, -1);
3632
- rb_define_method(cgsl_matrix, "QR_decomp", rb_gsl_linalg_QR_decomp, -1);
3633
- rb_define_module_function(mgsl_linalg, "QR_decomp!", rb_gsl_linalg_QR_decomp_bang, -1);
3634
- rb_define_module_function(mgsl_linalg_QR, "decomp!", rb_gsl_linalg_QR_decomp_bang, -1);
3635
- rb_define_method(cgsl_matrix, "QR_decomp!", rb_gsl_linalg_QR_decomp_bang, -1);
3636
-
3637
- rb_define_module_function(mgsl_linalg, "QR_solve", rb_gsl_linalg_QR_solve, -1);
3638
- rb_define_module_function(mgsl_linalg_QR, "solve", rb_gsl_linalg_QR_solve, -1);
3639
- rb_define_module_function(mgsl_linalg, "QR_svx", rb_gsl_linalg_QR_svx, -1);
3640
- rb_define_module_function(mgsl_linalg_QR, "svx", rb_gsl_linalg_QR_svx, -1);
3641
- rb_define_method(cgsl_matrix, "QR_solve", rb_gsl_linalg_QR_solve, -1);
3642
- rb_define_method(cgsl_matrix_QR, "solve", rb_gsl_linalg_QR_solve, -1);
3643
- rb_define_method(cgsl_matrix, "QR_svx", rb_gsl_linalg_QR_svx, -1);
3644
- rb_define_method(cgsl_matrix_QR, "svx", rb_gsl_linalg_QR_svx, -1);
3645
-
3646
- rb_define_module_function(mgsl_linalg_QR, "lssolve", rb_gsl_linalg_QR_lssolve, -1);
3647
- rb_define_method(cgsl_matrix, "QR_lssolve", rb_gsl_linalg_QR_lssolve, -1);
3648
- rb_define_method(cgsl_matrix_QR, "lssolve", rb_gsl_linalg_QR_lssolve, -1);
3649
-
3650
- rb_define_module_function(mgsl_linalg_QR, "QTvec", rb_gsl_linalg_QR_QTvec, -1);
3651
- rb_define_method(cgsl_matrix_QR, "QTvec", rb_gsl_linalg_QR_QTvec, -1);
3652
- rb_define_module_function(mgsl_linalg_QR, "Qvec", rb_gsl_linalg_QR_Qvec, -1);
3653
- rb_define_method(cgsl_matrix_QR, "Qvec", rb_gsl_linalg_QR_Qvec, -1);
3654
-
3655
- rb_define_module_function(mgsl_linalg_QR, "Rsolve", rb_gsl_linalg_QR_Rsolve, -1);
3656
- rb_define_method(cgsl_matrix, "QR_Rsolve", rb_gsl_linalg_QR_Rsolve, -1);
3657
- rb_define_method(cgsl_matrix_QR, "Rsolve", rb_gsl_linalg_QR_Rsolve, -1);
3658
-
3659
- rb_define_module_function(mgsl_linalg_QR, "Rsvx", rb_gsl_linalg_QR_Rsvx, -1);
3660
- rb_define_method(cgsl_matrix_QR, "Rsvx", rb_gsl_linalg_QR_Rsvx, 1);
3661
-
3662
- rb_define_module_function(mgsl_linalg_QR, "unpack", rb_gsl_linalg_QR_unpack, -1);
3663
- rb_define_method(cgsl_matrix_QR, "unpack", rb_gsl_linalg_QR_unpack, -1);
3664
-
3665
- rb_define_module_function(mgsl_linalg_QR, "QRsolve", rb_gsl_linalg_QR_QRsolve, -1);
3666
- rb_define_module_function(mgsl_linalg_QR, "update", rb_gsl_linalg_QR_update, 4);
3667
-
3668
- rb_define_method(mgsl_linalg, "R_solve", rb_gsl_linalg_R_solve, -1);
3669
- rb_define_method(cgsl_matrix_R, "solve", rb_gsl_linalg_R_solve, -1);
3670
- /*
3671
- rb_define_method(cgsl_matrix_R, "svx", rb_gsl_linalg_R_svx, -1);
3672
- */
3673
- rb_define_module_function(mgsl_linalg_QRPT, "decomp", rb_gsl_linalg_QRPT_decomp, -1);
3674
- rb_define_method(cgsl_matrix, "QRPT_decomp", rb_gsl_linalg_QRPT_decomp, -1);
3675
- rb_define_module_function(mgsl_linalg_QRPT, "decomp!", rb_gsl_linalg_QRPT_decomp_bang, -1);
3676
- rb_define_method(cgsl_matrix, "QRPT_decomp!", rb_gsl_linalg_QRPT_decomp_bang, -1);
3677
-
3678
- rb_define_module_function(mgsl_linalg_QRPT, "decomp2", rb_gsl_linalg_QRPT_decomp2, -1);
3679
- rb_define_method(cgsl_matrix, "QRPT_decomp2", rb_gsl_linalg_QRPT_decomp2, -1);
3680
-
3681
- rb_define_module_function(mgsl_linalg_QRPT, "solve", rb_gsl_linalg_QRPT_solve, -1);
3682
- rb_define_method(cgsl_matrix, "QRPT_solve", rb_gsl_linalg_QRPT_solve, -1);
3683
- rb_define_method(cgsl_matrix_QRPT, "solve", rb_gsl_linalg_QRPT_solve, -1);
3684
-
3685
- rb_define_module_function(mgsl_linalg_QRPT, "svx", rb_gsl_linalg_QRPT_svx, -1);
3686
- rb_define_method(cgsl_matrix, "QRPT_svx", rb_gsl_linalg_QRPT_svx, -1);
3687
- rb_define_method(cgsl_matrix_QRPT, "svx", rb_gsl_linalg_QRPT_svx, -1);
3688
-
3689
- rb_define_module_function(mgsl_linalg_QRPT, "QRsolve", rb_gsl_linalg_QRPT_QRsolve, 4);
3690
- rb_define_module_function(mgsl_linalg_QRPT, "update", rb_gsl_linalg_QRPT_update, 5);
3691
-
3692
- rb_define_module_function(mgsl_linalg_QRPT, "Rsolve", rb_gsl_linalg_QRPT_Rsolve, -1);
3693
- rb_define_method(cgsl_matrix_QRPT, "Rsolve", rb_gsl_linalg_QRPT_Rsolve, -1);
3694
- rb_define_module_function(mgsl_linalg_QRPT, "Rsvx", rb_gsl_linalg_QRPT_Rsvx, -1);
3695
- rb_define_method(cgsl_matrix_QRPT, "Rsvx", rb_gsl_linalg_QRPT_Rsvx, -1);
3696
-
3697
- /*****/
3698
- rb_define_module_function(mgsl_linalg_SV, "decomp", rb_gsl_linalg_SV_decomp, -1);
3699
- rb_define_method(cgsl_matrix, "SV_decomp", rb_gsl_linalg_SV_decomp, -1);
3700
- rb_define_alias(cgsl_matrix, "SVD", "SV_decomp");
3701
- rb_define_alias(cgsl_matrix, "svd", "SV_decomp");
3702
- rb_define_module_function(mgsl_linalg_SV, "decomp_mod", rb_gsl_linalg_SV_decomp_mod, -1);
3703
- rb_define_method(cgsl_matrix, "SV_decomp_mod", rb_gsl_linalg_SV_decomp_mod, -1);
3704
- rb_define_module_function(mgsl_linalg_SV, "decomp_jacobi", rb_gsl_linalg_SV_decomp_jacobi, -1);
3705
- rb_define_method(cgsl_matrix, "SV_decomp_jacobi", rb_gsl_linalg_SV_decomp_jacobi, -1);
3706
-
3707
- rb_define_module_function(mgsl_linalg_SV, "solve", rb_gsl_linalg_SV_solve, -1);
3708
-
3709
- rb_define_method(cgsl_matrix, "SV_solve", rb_gsl_linalg_SV_solve, -1);
3710
-
3711
- /*****/
3712
- rb_define_module_function(mgsl_linalg_cholesky, "decomp", rb_gsl_linalg_cholesky_decomp, -1);
3713
- rb_define_method(cgsl_matrix, "cholesky_decomp", rb_gsl_linalg_cholesky_decomp, -1);
3714
-
3715
- rb_define_module_function(mgsl_linalg_cholesky, "solve", rb_gsl_linalg_cholesky_solve, -1);
3716
- rb_define_method(cgsl_matrix, "cholesky_solve", rb_gsl_linalg_cholesky_solve, -1);
3717
- rb_define_method(cgsl_matrix_C, "solve", rb_gsl_linalg_cholesky_solve, -1);
3718
- rb_define_module_function(mgsl_linalg_cholesky, "svx", rb_gsl_linalg_cholesky_svx, -1);
3719
- rb_define_method(cgsl_matrix, "cholesky_svx", rb_gsl_linalg_cholesky_svx, -1);
3720
- rb_define_method(cgsl_matrix_C, "svx", rb_gsl_linalg_cholesky_svx, -1);
3721
-
3722
- /*****/
3723
-
3724
- rb_define_module_function(mgsl_linalg_symmtd, "decomp", rb_gsl_linalg_symmtd_decomp, -1);
3725
- rb_define_method(cgsl_matrix, "symmtd_decomp", rb_gsl_linalg_symmtd_decomp, -1);
3726
- rb_define_module_function(mgsl_linalg_symmtd, "decomp!", rb_gsl_linalg_symmtd_decomp2, -1);
3727
- rb_define_method(cgsl_matrix, "symmtd_decomp!", rb_gsl_linalg_symmtd_decomp2, -1);
3728
-
3729
- rb_define_method(cgsl_matrix, "symmtd_unpack", rb_gsl_linalg_symmtd_unpack, -1);
3730
- rb_define_method(cgsl_matrix, "symmtd_unpack_T", rb_gsl_linalg_symmtd_unpack_T, -1);
3731
-
3732
- rb_define_module_function(mgsl_linalg_symmtd, "unpack", rb_gsl_linalg_symmtd_unpack, -1);
3733
- rb_define_module_function(mgsl_linalg_symmtd, "unpack_T", rb_gsl_linalg_symmtd_unpack_T, -1);
3734
- /*****/
3735
- rb_define_module_function(mgsl_linalg_hermtd, "decomp", rb_gsl_linalg_hermtd_decomp, -1);
3736
- rb_define_method(cgsl_matrix, "hermtd_decomp", rb_gsl_linalg_hermtd_decomp, -1);
3737
- rb_define_module_function(mgsl_linalg_hermtd, "decomp!", rb_gsl_linalg_hermtd_decomp2, -1);
3738
- rb_define_method(cgsl_matrix, "hermtd_decomp!", rb_gsl_linalg_hermtd_decomp2, -1);
3739
-
3740
- rb_define_method(cgsl_matrix_complex, "hermtd_unpack", rb_gsl_linalg_hermtd_unpack, -1);
3741
- rb_define_module_function(mgsl_linalg_hermtd, "unpack", rb_gsl_linalg_hermtd_unpack, -1);
3742
- rb_define_method(cgsl_matrix_complex, "hermtd_unpack_T", rb_gsl_linalg_hermtd_unpack_T, -1);
3743
- rb_define_module_function(mgsl_linalg_hermtd, "unpack_T", rb_gsl_linalg_hermtd_unpack_T, -1);
3744
-
3745
- /*****/
3746
- rb_define_method(cgsl_matrix, "bidiag_decomp", rb_gsl_linalg_bidiag_decomp, -1);
3747
- rb_define_method(cgsl_matrix, "bidiag_decomp!", rb_gsl_linalg_bidiag_decomp2, -1);
3748
-
3749
- rb_define_module_function(mgsl_linalg, "bidiag_decomp", rb_gsl_linalg_bidiag_decomp, -1);
3750
- rb_define_module_function(mgsl_linalg, "bidiag_decomp!", rb_gsl_linalg_bidiag_decomp2, -1);
3751
- rb_define_module_function(mgsl_linalg_bidiag, "decomp", rb_gsl_linalg_bidiag_decomp, -1);
3752
- rb_define_module_function(mgsl_linalg_bidiag, "decomp!", rb_gsl_linalg_bidiag_decomp2, -1);
3753
-
3754
- rb_define_method(cgsl_matrix, "bidiag_unpack", rb_gsl_linalg_bidiag_unpack, -1);
3755
- rb_define_method(cgsl_matrix, "bidiag_unpack2", rb_gsl_linalg_bidiag_unpack2, -1);
3756
- rb_define_module_function(mgsl_linalg, "bidiag_unpack", rb_gsl_linalg_bidiag_unpack, -1);
3757
- rb_define_module_function(mgsl_linalg, "bidiag_unpack2", rb_gsl_linalg_bidiag_unpack2, -1);
3758
- rb_define_module_function(mgsl_linalg_bidiag, "unpack", rb_gsl_linalg_bidiag_unpack, -1);
3759
- rb_define_module_function(mgsl_linalg_bidiag, "unpack2", rb_gsl_linalg_bidiag_unpack2, -1);
3760
-
3761
- rb_define_method(cgsl_matrix, "bidiag_unpack_B", rb_gsl_linalg_bidiag_unpack_B, -1);
3762
- rb_define_module_function(mgsl_linalg, "bidiag_unpack_B", rb_gsl_linalg_bidiag_unpack_B, -1);
3763
- rb_define_module_function(mgsl_linalg_bidiag, "unpack_B", rb_gsl_linalg_bidiag_unpack_B, -1);
3764
- /*****/
3765
- rb_define_module_function(mgsl_linalg, "householder_transform",
3766
- rb_gsl_linalg_householder_transform, -1);
3767
- rb_define_module_function(mgsl_linalg_Householder, "transform",
3768
- rb_gsl_linalg_householder_transform, -1);
3769
- rb_define_module_function(mgsl_linalg_HH, "transform",
3770
- rb_gsl_linalg_householder_transform, -1);
3771
- rb_define_method(cgsl_vector, "householder_transform",
3772
- rb_gsl_linalg_householder_transform, -1);
3773
-
3774
- rb_define_module_function(mgsl_linalg, "householder_hm",
3775
- rb_gsl_linalg_householder_hm, 3);
3776
- rb_define_module_function(mgsl_linalg_Householder, "hm",
3777
- rb_gsl_linalg_householder_hm, 3);
3778
- rb_define_module_function(mgsl_linalg_HH, "hm",
3779
- rb_gsl_linalg_householder_hm, 3);
3780
-
3781
- rb_define_module_function(mgsl_linalg, "householder_mh",
3782
- rb_gsl_linalg_householder_mh, 3);
3783
- rb_define_module_function(mgsl_linalg_Householder, "mh",
3784
- rb_gsl_linalg_householder_mh, 3);
3785
- rb_define_module_function(mgsl_linalg_HH, "mh",
3786
- rb_gsl_linalg_householder_mh, 3);
3787
-
3788
- rb_define_module_function(mgsl_linalg, "householder_hv",
3789
- rb_gsl_linalg_householder_hv, 3);
3790
- rb_define_module_function(mgsl_linalg_Householder, "hv",
3791
- rb_gsl_linalg_householder_hv, 3);
3792
- rb_define_module_function(mgsl_linalg_HH, "hv",
3793
- rb_gsl_linalg_householder_hv, 3);
3794
-
3795
- rb_define_module_function(mgsl_linalg_HH, "solve", rb_gsl_linalg_HH_solve, -1);
3796
- rb_define_module_function(mgsl_linalg_HH, "solve!", rb_gsl_linalg_HH_solve_bang, -1);
3797
- rb_define_method(cgsl_matrix, "HH_solve", rb_gsl_linalg_HH_solve, -1);
3798
- rb_define_method(cgsl_matrix, "HH_solve!", rb_gsl_linalg_HH_solve_bang, -1);
3799
- rb_define_module_function(mgsl_linalg_HH, "svx", rb_gsl_linalg_HH_svx, -1);
3800
- rb_define_method(cgsl_matrix, "HH_svx", rb_gsl_linalg_HH_svx, -1);
3801
-
3802
- /*****/
3803
-
3804
- rb_define_module_function(mgsl_linalg, "solve_symm_tridiag", rb_gsl_linalg_solve_symm_tridiag, 3);
3805
-
3806
- rb_define_module_function(mgsl_linalg_tridiag, "solve_symm", rb_gsl_linalg_solve_symm_tridiag, 3);
3807
-
3808
- rb_define_module_function(mgsl_linalg, "solve_tridiag", rb_gsl_linalg_solve_tridiag, 4);
3809
- rb_define_module_function(mgsl_linalg_tridiag, "solve", rb_gsl_linalg_solve_tridiag, 4);
3810
- rb_define_module_function(mgsl_linalg, "solve_symm_cyc_tridiag", rb_gsl_linalg_solve_symm_cyc_tridiag, 3);
3811
- rb_define_module_function(mgsl_linalg, "solve_cyc_tridiag", rb_gsl_linalg_solve_cyc_tridiag, 4);
3812
- rb_define_module_function(mgsl_linalg_tridiag, "solve_symm_cyc", rb_gsl_linalg_solve_symm_cyc_tridiag, 3);
3813
- rb_define_module_function(mgsl_linalg_tridiag, "solve_cyc", rb_gsl_linalg_solve_cyc_tridiag, 4);
3814
-
3815
- /*****/
3816
- rb_define_module_function(mgsl_linalg, "balance_columns!",
3817
- rb_gsl_linalg_balance_columns_bang, -1);
3818
- rb_define_method(cgsl_matrix, "balance_columns!",
3819
- rb_gsl_linalg_balance_columns_bang, -1);
3820
- rb_define_module_function(mgsl_linalg, "balance_columns",
3821
- rb_gsl_linalg_balance_columns, -1);
3822
- rb_define_method(cgsl_matrix, "balance_columns",
3823
- rb_gsl_linalg_balance_columns, -1);
3824
- rb_define_alias(cgsl_matrix, "balance", "balance_columns");
3825
- rb_define_alias(cgsl_matrix, "balanc", "balance_columns");
3826
- /*****/
3827
-
3828
- Init_gsl_linalg_complex(mgsl_linalg);
3829
-
3830
- /** GSL-1.6 **/
3831
- rb_define_module_function(mgsl_linalg, "LQ_decomp", rb_gsl_linalg_LQ_decomp, -1);
3832
- rb_define_module_function(mgsl_linalg_LQ, "decomp", rb_gsl_linalg_LQ_decomp, -1);
3833
- rb_define_method(cgsl_matrix, "LQ_decomp", rb_gsl_linalg_LQ_decomp, -1);
3834
- rb_define_module_function(mgsl_linalg, "LQ_decomp!", rb_gsl_linalg_LQ_decomp_bang, -1);
3835
- rb_define_module_function(mgsl_linalg_LQ, "decomp!", rb_gsl_linalg_LQ_decomp_bang, -1);
3836
- rb_define_method(cgsl_matrix, "LQ_decomp!", rb_gsl_linalg_LQ_decomp_bang, -1);
3837
-
3838
- rb_define_module_function(mgsl_linalg, "LQ_solve_T", rb_gsl_linalg_LQ_solve, -1);
3839
- rb_define_module_function(mgsl_linalg_LQ, "solve_T", rb_gsl_linalg_LQ_solve, -1);
3840
- rb_define_module_function(mgsl_linalg, "LQ_svx_T", rb_gsl_linalg_LQ_svx, -1);
3841
- rb_define_module_function(mgsl_linalg_LQ, "svx_T", rb_gsl_linalg_LQ_svx, -1);
3842
- rb_define_method(cgsl_matrix, "LQ_solve_T", rb_gsl_linalg_LQ_solve, -1);
3843
- rb_define_method(cgsl_matrix_LQ, "solve_T", rb_gsl_linalg_LQ_solve, -1);
3844
- rb_define_method(cgsl_matrix, "LQ_svx_T", rb_gsl_linalg_LQ_svx, -1);
3845
- rb_define_method(cgsl_matrix_LQ, "svx_T", rb_gsl_linalg_LQ_svx, -1);
3846
-
3847
- rb_define_module_function(mgsl_linalg_LQ, "lssolve_T", rb_gsl_linalg_LQ_lssolve, -1);
3848
- rb_define_method(cgsl_matrix, "LQ_lssolve_T", rb_gsl_linalg_LQ_lssolve, -1);
3849
- rb_define_method(cgsl_matrix_LQ, "lssolve_T", rb_gsl_linalg_LQ_lssolve, -1);
3850
-
3851
- rb_define_module_function(mgsl_linalg_LQ, "vecQT", rb_gsl_linalg_LQ_vecQT, -1);
3852
- rb_define_method(cgsl_matrix_LQ, "vecQT", rb_gsl_linalg_LQ_vecQT, -1);
3853
- rb_define_module_function(mgsl_linalg_LQ, "vecQ", rb_gsl_linalg_LQ_vecQ, -1);
3854
- rb_define_method(cgsl_matrix_LQ, "vecQ", rb_gsl_linalg_LQ_vecQ, -1);
3855
-
3856
- rb_define_module_function(mgsl_linalg_LQ, "Lsolve_T", rb_gsl_linalg_LQ_Lsolve, -1);
3857
- rb_define_method(cgsl_matrix, "LQ_Lsolve_T", rb_gsl_linalg_LQ_Lsolve, -1);
3858
- rb_define_method(cgsl_matrix_LQ, "Lsolve_T", rb_gsl_linalg_LQ_Lsolve, -1);
3859
-
3860
- rb_define_module_function(mgsl_linalg_LQ, "Lsvx_T", rb_gsl_linalg_LQ_Lsvx, -1);
3861
- rb_define_method(cgsl_matrix_LQ, "Lsvx_T", rb_gsl_linalg_LQ_Lsvx, 1);
3862
-
3863
- rb_define_module_function(mgsl_linalg_LQ, "unpack", rb_gsl_linalg_LQ_unpack, -1);
3864
- rb_define_method(cgsl_matrix_LQ, "unpack", rb_gsl_linalg_LQ_unpack, -1);
3865
-
3866
- rb_define_module_function(mgsl_linalg_LQ, "LQsolve_T", rb_gsl_linalg_LQ_LQsolve, -1);
3867
- rb_define_module_function(mgsl_linalg_LQ, "update", rb_gsl_linalg_LQ_update, 4);
3868
-
3869
- rb_define_method(mgsl_linalg, "L_solve_T", rb_gsl_linalg_L_solve, -1);
3870
- rb_define_method(cgsl_matrix_L, "solve_T", rb_gsl_linalg_L_solve, -1);
3871
- /*
3872
- rb_define_method(cgsl_matrix_R, "svx", rb_gsl_linalg_R_svx, -1);
3873
- */
3874
- rb_define_module_function(mgsl_linalg_PTLQ, "decomp", rb_gsl_linalg_PTLQ_decomp, -1);
3875
- rb_define_method(cgsl_matrix, "PTLQ_decomp", rb_gsl_linalg_PTLQ_decomp, -1);
3876
- rb_define_module_function(mgsl_linalg_PTLQ, "decomp!", rb_gsl_linalg_PTLQ_decomp_bang, -1);
3877
- rb_define_method(cgsl_matrix, "PTLQ_decomp!", rb_gsl_linalg_PTLQ_decomp_bang, -1);
3878
-
3879
- rb_define_module_function(mgsl_linalg_PTLQ, "decomp2", rb_gsl_linalg_PTLQ_decomp2, -1);
3880
- rb_define_method(cgsl_matrix, "PTLQ_decomp2", rb_gsl_linalg_PTLQ_decomp2, -1);
3881
-
3882
- rb_define_module_function(mgsl_linalg_PTLQ, "solve_T", rb_gsl_linalg_PTLQ_solve, -1);
3883
- rb_define_method(cgsl_matrix, "PTLQ_solve_T", rb_gsl_linalg_PTLQ_solve, -1);
3884
- rb_define_method(cgsl_matrix_PTLQ, "solve_T", rb_gsl_linalg_PTLQ_solve, -1);
3885
-
3886
- rb_define_module_function(mgsl_linalg_PTLQ, "svx_T", rb_gsl_linalg_PTLQ_svx, -1);
3887
- rb_define_method(cgsl_matrix, "PTLQ_svx_T", rb_gsl_linalg_PTLQ_svx, -1);
3888
- rb_define_method(cgsl_matrix_PTLQ, "svx_T", rb_gsl_linalg_PTLQ_svx, -1);
3889
-
3890
- rb_define_module_function(mgsl_linalg_PTLQ, "LQsolve_T", rb_gsl_linalg_PTLQ_LQsolve, 4);
3891
- rb_define_module_function(mgsl_linalg_PTLQ, "update", rb_gsl_linalg_PTLQ_update, 5);
3892
-
3893
- rb_define_module_function(mgsl_linalg_PTLQ, "Lsolve_T", rb_gsl_linalg_PTLQ_Lsolve, -1);
3894
- rb_define_method(cgsl_matrix_PTLQ, "Lsolve_T", rb_gsl_linalg_PTLQ_Lsolve, -1);
3895
- rb_define_module_function(mgsl_linalg_PTLQ, "Lsvx_T", rb_gsl_linalg_PTLQ_Lsvx, -1);
3896
- rb_define_method(cgsl_matrix_PTLQ, "Lsvx_T", rb_gsl_linalg_PTLQ_Lsvx, -1);
3897
-
3898
- mhessen = rb_define_module_under(mgsl_linalg, "Hessenberg");
3899
- rb_define_module_function(mhessen, "decomp", rb_gsl_linalg_hessenberg_decomp, 1);
3900
- rb_define_module_function(mgsl_linalg, "heesenberg_decomp", rb_gsl_linalg_hessenberg_decomp, 1);
3901
- rb_define_module_function(mhessen, "unpack", rb_gsl_linalg_hessenberg_unpack, 2);
3902
- rb_define_module_function(mgsl_linalg, "hessenberg_unpack", rb_gsl_linalg_hessenberg_unpack, 2);
3903
- rb_define_module_function(mhessen, "unpack_accum", rb_gsl_linalg_hessenberg_unpack_accum, -1);
3904
- rb_define_module_function(mgsl_linalg, "hessenberg_unpack_accum", rb_gsl_linalg_hessenberg_unpack_accum, -1);
3905
- rb_define_module_function(mhessen, "set_zero", rb_gsl_linalg_hessenberg_set_zero, 1);
3906
- rb_define_module_function(mgsl_linalg, "hessenberg_set_zero", rb_gsl_linalg_hessenberg_set_zero, 1);
3907
-
3908
- rb_define_module_function(mgsl_linalg, "hesstri_decomp", rb_gsl_linalg_hesstri_decomp, -1);
3909
- rb_define_module_function(mgsl_linalg, "hesstri_decomp!", rb_gsl_linalg_hesstri_decomp_bang, -1);
3910
-
3911
- rb_define_module_function(mgsl_linalg, "balance_matrix", rb_gsl_linalg_balance_matrix, -1);
3912
- rb_define_module_function(mgsl_linalg, "balance_matrix!", rb_gsl_linalg_balance_matrix2, -1);
3913
- rb_define_module_function(mgsl_linalg, "balance", rb_gsl_linalg_balance_matrix, -1);
3914
- rb_define_module_function(mgsl_linalg, "balance!", rb_gsl_linalg_balance_matrix2, -1);
3915
- }