The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Math::GSL::Linalg::SVD - Perl extension with convenience methods for performing SVD and eigenvector decomp with the gsl C libraries.

SYNOPSIS

    use Math::GSL::Linalg::SVD;

    # Create object.
    my $svd = Math::GSL::Linalg::SVD->new( { verbose => 1 } );

    my $data = [ 
                    [qw/  9.515970281313E-01  1.230695618728E-01 -1.652767938310E-01 /],
                    [qw/ -1.788010086499E-01  3.654739881179E-01  8.526964090247E-02 /],
                    [qw/  4.156708817272E-02  5.298288357316E-02  7.130047145031E-01 /],
               ];

    # Load data.
    $svd->load_data( { data => $data } );

    # Perform singular value decomposition using the Golub-Reinsch algorithm (this is the default - see METHODS).
    # To perform eigen decomposition pass 'eign' as algorithm argument - see METHODS.
    $svd->decompose( { algorithm => q{gd} } );

    # Pass results - see METHODS for more details.
    my ($S_vec_ref, $U_mat_ref, $V_mat_ref, $original_data_ref) = $svd->results;

    # Print elements of vector S.
    print qq{\nPrint diagonal elements in vector S\n};  
    for my $s (@{$S_vec_ref}) { print qq{$s, }; }

    # Print elements of matrix U.
    print qq{\nPrint matrix U\n};  
    for my $r (0..$#{$U_mat_ref}) {
        for my $c (0..$#{$U_mat_ref->[$r]}) { print qq{$U_mat_ref->[$r][$c], } }; print qq{\n}; }

    # Print elements of matrix V.
    print qq{\nPrint matrix V\n};  
    for my $r (0..$#{$V_mat_ref}) {
        for my $c (0..$#{$V_mat_ref->[$r]}) { print qq{$V_mat_ref->[$r][$c], } }; print qq{\n}; }
    

DESCRIPTION

The singular value decomposition (SVD) is an important factorization of a rectangular real matrix - see http://en.wikipedia.org/wiki/Singular_value_decomposition. Eigendecomposition is the factorization of a matrix into a canonical form, whereby the matrix is represented in terms of its eigenvalues and eigenvectors - see http://en.wikipedia.org/wiki/Eigendecomposition_of_a_matrix. This module implements the SVD and Eigen decomposition routines of the The C GNU Scientific Library (GSL). It provides simple convinience methods in the upper-level Math::GSL::Linalg::SVD namespace to perform these operations. Alternatively, it also provides direct access to the C routines in the Math::GSL::Linalg::SVD::Matrix, Math::GSL::Linalg::SVD::Vector and Math::GSL::Linalg::SVD::Eigen namespaces - see METHODS.

METHODS

This is a C-Wrapper for the gsl SVD and Eigen decomp routines. Its provides two means of accessing them. First, a basic OO-interface of convenience methods to allow simple use of the various sdv and eigen routines within the Math::GSL::Linalg::SVD namespaces. Second, it allows you to use the various routines directly using an object interface for the various C structure types. These exist within specific lower-level namespaces for convenience - see below.

Math::GSL::Linalg::SVD

new

Create a new Math:GSL::Linalg::SVD object.

    my $svd = Math::GSL::Linalg::SVD->new();
    # Pass verbose to turn on minimal messages.
    my $svd = Math::GSL::Linalg::SVD->new( { verbose => 1 } );

load_data

Used for loading data into object. Data is fed as a reference to a LoL within an anonymous hash using the named argument 'data'.

    $svd->load_data( { data => [ 
                                    [qw/  9.515970281313E-01 1.230695618728E-01 /], 
                                    [qw/ -1.788010086499E-01 3.654739881179E-01 /], 
                                    [qw/  4.156708817272E-02  5.298288357316E-02 /], 
                               ] } );

decompose

Performs one of several different singular value decomposition algorithms on the loaded matrix (or computes eigenvalues and eigenvectors) depending on argument passed with with 'algorithm' argument. To use the Golub-Reinsch algorithm implemented by gsl_linalg_SV_decomp pass 'gd'. To use the modified Golub-Reinsch algorithm implemented by gsl_linalg_SV_decomp_mod pass 'mod'. To use the one-sided Jacobi orthogonalization algorithm implemented by gsl_linalg_SV_decomp_jacobi pass 'jacobi'. To perform the eigenvalue and eigenvector calculations implemented by gsl_eigen_symmv pass 'eigen'. See http://www.gnu.org/software/gsl/manual/html_node/Singular-Value-Decomposition.html for further details.

    # Perform svd using the Golub-Reinsch algorithm pass 'gd' or nothing.
    $svd->decompose();
    $svd->decompose( { algorithm => q{mod} } );
    $svd->decompose( { algorithm => q{jacobi} } );
    $eigen->decompose( { algorithm => q{eigen} } );

results

Used to access the results of the analysis. Called in LIST context. For svd an ordered LIST of the LoLs is returned (corresponding to Vector S, Matrix U, Matrix V and Matrix A (see http://www.gnu.org/software/gsl/manual/html_node/Singular-Value-Decomposition.html). See SYNOPSIS.

    my ($S_vec_ref, $U_mat_ref, $V_mat_ref, $original_data_ref) = $svd->results;

For eigen computation an ordered list of LoLs is returned corresponding to unordered eigenvalues, the eigenvectors (in the same order as the eigenvalues) and the original data matrix. See http://www.gnu.org/software/gsl/manual/html_node/Real-Symmetric-Matrices.html.

    my ($e_val_ref, $e_vec_ref, $original_data_ref) = $eigen->results;

    # Print eigenvalues along with corresponding eigenvectors.
    for my $i (0..$#{$e_val_ref}) {
        print qq{\nEigenvalue: $e_val_ref->[$i], };  
        print qq{\nEigenvector: }; 
        for my $vec_component (@{$e_vec_ref->[$i]}) { print qq{$vec_component, }; }; print qq{\n}; }

Math::GSL::Linalg::SVD::Matrix

This namespace functions as an interface to the gsl_matrix C-structure typedef.

new

    Name:           new
    Implements:     gsl_matrix_alloc
    Usage:          $gsl_matrix_pointer_as_perl_object = Math::GSL::Linalg::SVD::Matrix->new;
    Returns:        pointer to a gsl_matrix type as Perl object

set_matrix

    Name:           set_matrix
    Implements:     gsl_matrix_set
    Usage:          $gsl_matrix_pointer_as_perl_object->set_matrix($row, $col, $double_number);
    Returns:  

get_matrix

    Name:           matrix_get
    Implements:     gsl_matrix_get
    Usage:          $gsl_matrix_pointer_as_perl_object->set_matrix($row, $col);
    Returns:        scalar value

SV_decomp

    Name:           SV_decomp
    Implements:     gsl_linalg_SV_decomp
    Usage:          $gsl_matrix_pointer_as_perl_object->SV_decomp (...);
    Returns:  

SV_decomp_mod

    Name:           SV_decomp_mod
    Implements:     gsl_linalg_SV_decomp_mod
    Usage:          $gsl_matrix_pointer_as_perl_object->SV_decomp_mod (...);
    Returns:  

SV_decomp_jacobi

    Name:           SV_decomp_jacobi
    Implements:     gsl_linalg_SV_decomp_jacobi
    Usage:          $gsl_matrix_pointer_as_perl_object->SV_decomp_mod (...);
    Returns:  

Eigen_decomp

    Name:           Eigen_decomp
    Implements:     gsl_eigen_symmv
    Usage:          $gsl_matrix_pointer_as_perl_object->Eigen_decomp (...);
    Returns:  

Math::GSL::Linalg::SVD::Vector

This namespace functions as an interface to the gsl_vector C-structure typedef.

new

    Name:           new
    Implements:     gsl_vector_alloc
    Usage:          $gsl_vector_pointer_as_perl_object = Math::GSL::Linalg::SVD::Vector->new;
    Returns:        pointer to gsl_vector as perl object

set_vector

    Name:           vector_set
    Implements:     gsl_vector_set
    Usage:          $gsl_vector_pointer_as_perl_object->set_vector($row, $col, $double_number);
    Returns:  

get_vector

    Name:           vector_get
    Implements:     gsl_vector_get
    Usage:          $gsl_vector_pointer_as_perl_object->set_vector($row, $col)
    Returns:        scalar value

Math::GSL::Linalg::SVD::Eigen

This namespace functions as an interface to the gsl_eigen_symmv_workspace C-structure typedef used as workspace for the eigen decomposition routines of the gsl library.

new

    Name:           new
    Implements:     gsl_eigen_symmv_alloc
    Usage:          $gsl_vector_pointer_as_perl_object = Math::GSL::Linalg::SVD::vector->new;
    Returns:        pointer to gsl_eigen_symmv type as perl object

AUTHOR

Daniel S. T. Hughes <dsth@cpan.org>

LICENCE AND COPYRIGHT

Copyright (c) 2009, Daniel S. T. Hughes <dsth@cantab.net>. All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.

DISCLAIMER OF WARRANTY

Because this software is licensed free of charge, there is no warranty for the software, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide the software "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the software is with you. Should the software prove defective, you assume the cost of all necessary servicing, repair, or correction.

In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute the software as permitted by the above licence, be liable to you for damages, including any general, special, incidental, or consequential damages arising out of the use or inability to use the software (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the software to operate with any other software), even if such holder or other party has been advised of the possibility of such damages. Dr Daniel S. T. Hughes, <dsth@>