Use explicit deallocation for workspaces in eigensystem module - gsl-shell.git - gsl-shell

index : gsl-shell.git
gsl-shell
summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrancesco Abbate <francesco.bbt@gmail.com>2012年05月12日 22:49:43 +0200
committerFrancesco Abbate <francesco.bbt@gmail.com>2012年05月12日 22:49:43 +0200
commit9449327236a05d2e5f94c3bb35a255500550036f (patch)
tree83c899e25a352ed72bbe51422c7fbc486b6dd130
parentfbdbd2ff555e3c2ad5fcb5a20893a5da42466e08 (diff)
downloadgsl-shell-9449327236a05d2e5f94c3bb35a255500550036f.tar.gz
Use explicit deallocation for workspaces in eigensystem module
Diffstat
-rw-r--r--eigen.lua 31
1 files changed, 17 insertions, 14 deletions
diff --git a/eigen.lua b/eigen.lua
index 689cdc2c..77ad3fb2 100644
--- a/eigen.lua
+++ b/eigen.lua
@@ -336,28 +336,27 @@ eigen.SORT_NONE = gsl.GSL_EIGEN_SORT_NONE
--Calculates the eigenvalues/eigenvectors of the symmetric matrix m
--the order can be used to determine the sorting of the eigenvalues according to their value
function eigen.symm(m, order)
- local size = m.size1
- local A = matrix.copy(m)
+ local size = m.size1
+ local A = matrix.copy(m)
local eval = matrix.alloc(size, 1)
local evec = matrix.alloc (size, size)
- local xeval = gsl.gsl_matrix_column(eval, 0)
- order = order or eigen.SORT_VAL_DESC
+ local xeval = gsl.gsl_matrix_column(eval, 0)
+ order = order or eigen.SORT_VAL_DESC
- local w = ffi.gc(gsl.gsl_eigen_symmv_alloc (size), gsl.gsl_eigen_symmv_free)
+ local w = gsl.gsl_eigen_symmv_alloc (size)
gsl_check(gsl.gsl_eigen_symmv (A, xeval, evec, w))
+ gsl.gsl_eigen_symmv_free (w)
if order ~= eigen.SORT_NONE then
- gsl.gsl_eigen_symmv_sort (xeval, evec, order)
+ gsl.gsl_eigen_symmv_sort (xeval, evec, order)
end
return eval,evec
-
end
--Calculates the eigenvalues/eigenvectors of the real nonsymmetric matrix m
--the order can be used to determine the sorting of the eigenvalues according to their value
function eigen.non_symm(m, order)
-
local size = m.size1
local A = matrix.copy(m)
local eval = matrix.calloc(size, 1)
@@ -365,15 +364,15 @@ function eigen.non_symm(m, order)
local xeval = gsl.gsl_matrix_complex_column(eval, 0)
order = order or eigen.SORT_VAL_DESC
- local w = ffi.gc(gsl.gsl_eigen_nonsymmv_alloc (size), gsl.gsl_eigen_nonsymmv_free)
+ local w = gsl.gsl_eigen_nonsymmv_alloc (size)
gsl_check(gsl.gsl_eigen_nonsymmv (A, xeval, evec, w))
+ gsl.gsl_eigen_nonsymmv_free (w)
if order ~= eigen.SORT_NONE then
gsl.gsl_eigen_nonsymmv_sort (xeval, evec, order)
end
return eval,evec
-
end
function eigen.herm(m, order, eigenvalues_only)
@@ -384,8 +383,9 @@ function eigen.herm(m, order, eigenvalues_only)
local evec = matrix.calloc (size, size)
order = order or eigen.SORT_VAL_DESC
- local w = ffi.gc(gsl.gsl_eigen_hermv_alloc (size), gsl.gsl_eigen_hermv_free)
+ local w = gsl.gsl_eigen_hermv_alloc (size)
gsl_check(gsl.gsl_eigen_hermv(A, xeval, evec, w))
+ gsl.gsl_eigen_hermv_free (w)
if order ~= eigen.SORT_NONE then
gsl.gsl_eigen_hermv_sort (xeval, evec, order)
@@ -404,8 +404,9 @@ function eigen.gensymm(a, b)
local evec = matrix.alloc (size, size)
order = order or eigen.SORT_VAL_DESC
- local w = ffi.gc(gsl.gsl_eigen_gensymmv_alloc (size), gsl.gsl_eigen_gensymmv_free)
+ local w = gsl.gsl_eigen_gensymmv_alloc (size)
gsl_check(gsl.gsl_eigen_gensymmv(A,B, xeval, evec, w))
+ gsl.gsl_eigen_gensymmv_free (w)
if order ~= eigen.SORT_NONE then
gsl.gsl_eigen_gensymmv_sort (xeval, evec, order)
@@ -423,8 +424,9 @@ function eigen.genherm(a, b)
local evec = matrix.calloc (size, size)
order = order or eigen.SORT_VAL_DESC
- local w = ffi.gc(gsl.gsl_eigen_genhermv_alloc (size), gsl.gsl_eigen_genhermv_free)
+ local w = gsl.gsl_eigen_genhermv_alloc (size)
gsl_check(gsl.gsl_eigen_genhermv(A,B, xeval, evec, w))
+ gsl.gsl_eigen_genhermv_free (w)
if order ~= eigen.SORT_NONE then
gsl.gsl_eigen_genhermv_sort (xeval, evec, order)
@@ -446,8 +448,9 @@ function eigen.gen(a, b)
local evec = matrix.calloc (size, size)
order = order or eigen.SORT_VAL_DESC
- local w = ffi.gc(gsl.gsl_eigen_genv_alloc (size), gsl.gsl_eigen_genv_free)
+ local w = gsl.gsl_eigen_genv_alloc (size)
gsl_check(gsl.gsl_eigen_genv(A,B, alpha_vec, beta_vec, evec, w))
+ gsl.gsl_eigen_genv_free (w)
if order ~= eigen.SORT_NONE then
gsl.gsl_eigen_genv_sort (alpha_vec, beta_vec, evec, order)
generated by cgit v1.2.3 (git 2.39.1) at 2025年10月04日 03:58:46 +0000

AltStyle によって変換されたページ (->オリジナル) /