Use strings instead of enums for eigenvalues order specification - 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月13日 00:02:04 +0200
committerFrancesco Abbate <francesco.bbt@gmail.com>2012年05月13日 00:02:04 +0200
commitefab31466d5b5b10c650b7bbec0e833c8b20dfff (patch)
tree94229f0951a0d76157f8b5bdb889f91788799917
parent9449327236a05d2e5f94c3bb35a255500550036f (diff)
downloadgsl-shell-efab31466d5b5b10c650b7bbec0e833c8b20dfff.tar.gz
Use strings instead of enums for eigenvalues order specification
Diffstat
-rw-r--r--doc/user-manual/eigen.rst 14
-rw-r--r--eigen.lua 57
2 files changed, 40 insertions, 31 deletions
diff --git a/doc/user-manual/eigen.rst b/doc/user-manual/eigen.rst
index d696882a..e1098f77 100644
--- a/doc/user-manual/eigen.rst
+++ b/doc/user-manual/eigen.rst
@@ -19,20 +19,20 @@ Real Symmetric Matrices
This function computes the eigenvalues and eigenvectors of the real symmetric matrix A. The default ordering of the eigenvalues and eigenvectors is descending order in numerical value.
You can however choose from the following sorting shemes for the eigenvalues:
- `eigen.SORT_VAL_DESC`
+ 'desc'
descending order in numerical value
- `eigen.SORT_VAL_ASC`
+ 'asc'
ascending order in numerical value
- `eigen.SORT_ABS_ASC`
+ 'abs_asc'
ascending order in magnitude
- `eigen.SORT_ABS_DESC`
+ 'abs_desc'
descending order in magnitude
- `eigen.SORT_NONE`
+ 'none'
eigenvalue sorting
The function returns::
- eval, evec = symm(A, eigen.SORT_ABS_ASC)
+ eval, evec = symm(A, 'abs_asc')
while the first eigenvalue correpsonds to the first eigenvector stored in the first column of the eigenvectors matrix.
For real symmetric matrices, the library uses the symmetric bidiagonalization and QR reduction method.
@@ -53,7 +53,7 @@ Real Nonsymmetric Matrices
This function computes eigenvalues and right eigenvectors of the n-by-n real nonsymmetric matrix A.
The computed eigenvectors are normalized to have unit magnitude. On output, the upper portion of A contains the Schur form T::
- eval, evec, A = non_symm(A, eigen.SORT_ABS_ASC)
+ eval, evec, A = non_symm(A, 'abs_asc')
Complex Hermitian Matrices
diff --git a/eigen.lua b/eigen.lua
index 77ad3fb2..ab30a52a 100644
--- a/eigen.lua
+++ b/eigen.lua
@@ -326,12 +326,21 @@ gsl_eigen_invert_jacobi(const gsl_matrix * matrix,
-------------------------------------------------------------------------------
eigen = {}
---Definitions of the sorting order of the eigenvalues
-eigen.SORT_VAL_DESC = gsl.GSL_EIGEN_SORT_VAL_DESC
-eigen.SORT_VAL_ASC = gsl.GSL_EIGEN_SORT_VAL_ASC
-eigen.SORT_ABS_ASC = gsl.GSL_EIGEN_SORT_ABS_ASC
-eigen.SORT_ABS_DESC = gsl.GSL_EIGEN_SORT_ABS_DESC
-eigen.SORT_NONE = gsl.GSL_EIGEN_SORT_NONE
+order_lookup = {
+ asc = gsl.GSL_EIGEN_SORT_VAL_ASC,
+ desc = gsl.GSL_EIGEN_SORT_VAL_DESC,
+ abs_asc = gsl.GSL_EIGEN_SORT_ABS_ASC,
+ abs_desc = gsl.GSL_EIGEN_SORT_ABS_DESC,
+ none = gsl.GSL_EIGEN_SORT_NONE
+}
+
+local SORT_NONE = gsl.GSL_EIGEN_SORT_NONE
+
+local function get_order(order)
+ local sel = order and order_lookup[order] or gsl.GSL_EIGEN_SORT_VAL_DESC
+ if not sel then error('invalid order specification: '..order, 3) end
+ return sel
+end
--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
@@ -341,14 +350,14 @@ function eigen.symm(m, order)
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 order_sel = get_order(order)
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)
+ if order_sel ~= SORT_NONE then
+ gsl.gsl_eigen_symmv_sort (xeval, evec, order_sel)
end
return eval,evec
@@ -362,14 +371,14 @@ function eigen.non_symm(m, order)
local eval = matrix.calloc(size, 1)
local evec = matrix.calloc (size, size)
local xeval = gsl.gsl_matrix_complex_column(eval, 0)
- order = order or eigen.SORT_VAL_DESC
+ local order_sel = get_order(order)
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)
+ if order_sel ~= SORT_NONE then
+ gsl.gsl_eigen_nonsymmv_sort (xeval, evec, order_sel)
end
return eval,evec
@@ -381,14 +390,14 @@ function eigen.herm(m, order, eigenvalues_only)
local eval = matrix.alloc(size, 1)
local xeval = gsl.gsl_matrix_column(eval, 0)
local evec = matrix.calloc (size, size)
- order = order or eigen.SORT_VAL_DESC
+ local order_sel = get_order(order)
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)
+ if order_sel ~= SORT_NONE then
+ gsl.gsl_eigen_hermv_sort (xeval, evec, order_sel)
end
return eval,evec
@@ -402,14 +411,14 @@ function eigen.gensymm(a, b)
local eval = matrix.alloc(size, 1)
local xeval = gsl.gsl_matrix_column(eval, 0)
local evec = matrix.alloc (size, size)
- order = order or eigen.SORT_VAL_DESC
+ local order_sel = get_order(order)
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)
+ if order_sel ~= SORT_NONE then
+ gsl.gsl_eigen_gensymmv_sort (xeval, evec, order_sel)
end
return eval,evec
@@ -422,14 +431,14 @@ function eigen.genherm(a, b)
local eval = matrix.alloc(size, 1)
local xeval = gsl.gsl_matrix_column(eval, 0)
local evec = matrix.calloc (size, size)
- order = order or eigen.SORT_VAL_DESC
+ local order_sel = get_order(order)
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)
+ if order_sel ~= SORT_NONE then
+ gsl.gsl_eigen_genhermv_sort (xeval, evec, order_sel)
end
return eval,evec
@@ -446,14 +455,14 @@ function eigen.gen(a, b)
local beta_vec = gsl.gsl_matrix_column(beta, 0)
local evec = matrix.calloc (size, size)
- order = order or eigen.SORT_VAL_DESC
+ local order_sel = get_order(order)
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)
+ if order_sel ~= SORT_NONE then
+ gsl.gsl_eigen_genv_sort (alpha_vec, beta_vec, evec, order_sel)
end
return alpha, beta, evec
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月30日 12:14:04 +0000

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