SVD_DEMO 
 Demonstration of the Singular Value Decomposition
    
    
    
      SVD_DEMO
      is a FORTRAN90 program which
      demonstrates the computation of the singular value decomposition
      and a few of its properties.
    
    
      The singular value decomposition has uses in solving
      overdetermined or underdetermined linear systems,
      linear least squares problems, data compression,
      the pseudoinverse matrix,
      reduced order modeling, and
      the accurate computation of matrix rank and null space.
    
    
      The singular value decomposition of an M by N rectangular matrix A has
      the form
      
        A(mxn) = U(mxm) * S(mxn) * V'(nxn)
      
      where
      
        - 
          U is an orthogonal matrix, whose columns are the left singular vectors;
        
- 
          S is a diagonal matrix, whose min(m,n) diagonal entries are the singular values;
        
- 
          V is an orthogonal matrix, whose columns are the right singular vectors;
        
Note that the transpose of V is used in the decomposition, and that the diagonal matrix
      S is typically stored as a vector.
      Usage:
    
    
      
        svd_demo m n seed
      
      where
      
        - 
          m is the number of rows in the random matrix;
        
- 
          n is the number of columns in the random matrix;
        
- 
          seed an optional seed for the random number generator;
        
      Licensing:
    
    
      The computer code and data files described and made available on this web page
      are distributed under
      the GNU LGPL license.
    
    
      Languages:
    
    
      SVD_DEMO is available in
      a C version and
      a C++ version and
      a FORTRAN90 version and
      a MATLAB version.
    
    
      Related Data and Programs:
    
    
      
      FINGERPRINTS,
      a dataset directory which
      contains a few images of fingerprints.
    
    
      
      LAPACK_EXAMPLES,
      a FORTRAN90 program which
      demonstrates the use of the LAPACK linear algebra library.
    
    
      
      LINPACK,
      a FORTRAN90 library which
      includes routines to carry out the singular value
      decomposition.
    
    
      
      SVD_BASIS,
      a FORTRAN90 program which
      computes a reduced basis for a collection of data vectors using the SVD.
    
    
      
      SVD_SNOWFALL,
      a FORTRAN90 program which
      reads a file containing historical snowfall data and 
      analyzes the data with the Singular Value Decomposition (SVD),
      and plots created by GNUPLOT.
    
    
      
      SVD_TRUNCATED,
      a FORTRAN90 program which
      demonstrates the computation of the reduced or truncated 
      Singular Value Decomposition (SVD) that is useful for cases when
      one dimension of the matrix is much smaller than the other.
    
    
      
      TOMS358,
      a FORTRAN77 routine which
      computes the singular value decomposition
      for a complex matrix.
    
    
      Reference:
    
    
      
        - 
          Edward Anderson, Zhaojun Bai, Christian Bischof, Susan Blackford,
          James Demmel, Jack Dongarra, Jeremy Du Croz, Anne Greenbaum,
          Sven Hammarling, Alan McKenney, Danny Sorensen,
 LAPACK User's Guide,
 Third Edition,
 SIAM, 1999,
 ISBN: 0898714478,
 LC: QA76.73.F25L36
- 
          Jack Dongarra, Jim Bunch, Cleve Moler, Pete Stewart,
 LINPACK User's Guide,
 SIAM, 1979,
 ISBN13: 978-0-898711-72-1,
 LC: QA214.L56.
- 
          Gene Golub, Charles VanLoan,
 Matrix Computations,
          Third Edition,
 Johns Hopkins, 1996,
 ISBN: 0-8018-4513-X,
 LC: QA188.G65.
- 
          David Kahaner, Cleve Moler, Steven Nash,
 Numerical Methods and Software,
 Prentice Hall, 1989,
 ISBN: 0-13-627258-4,
 LC: TA345.K34.
- 
          Lloyd Trefethen, David Bau,
 Numerical Linear Algebra,
 SIAM, 1997,
 ISBN: 0-89871-361-7,
 LC: QA184.T74.
      Source Code:
    
    
      
    
    
      Examples and Tests:
    
    
      
    
    
      List of Routines:
    
    
      
        - 
          MAIN is the main program for SVD_DEMO.
        
- 
          COMPARE_LINPACK_LAPACK compares the SVD's from LINPACK and LAPACK.
        
- 
          GET_SEED returns a seed for the random number generator.
        
- 
          GET_SVD_LAPACK gets the SVD of a matrix using a call to LAPACK.
        
- 
          GET_SVD_LINPACK gets the SVD of a matrix using a call to LINPACK.
        
- 
          I4_UNIFORM returns a pseudorandom I4.
        
- 
          PSEUDO_INVERSE computes the pseudoinverse.
        
- 
          PSEUDO_LINEAR_SOLVE_TEST uses the pseudoinverse for linear systems.
        
- 
          PSEUDO_PRODUCT_TEST examines the products A*A+ and A+*A.
        
- 
          R4_UNIFORM_01 returns a unit pseudorandom R4.
        
- 
          R8MAT_DIF_FRO returns the Frobenius norm of the difference of two R8MAT's.
        
- 
          R8MAT_NORM_FRO returns the Frobenius norm of an R8MAT.
        
- 
          R8MAT_PRINT prints an R8MAT.
        
- 
          R8MAT_PRINT_SOME prints some of an R8MAT.
        
- 
          R8MAT_UNIFORM_01 returns a unit pseudorandom R8MAT.
        
- 
          R8VEC_NORM_L2 returns the L2 norm of an R8VEC.
        
- 
          R8VEC_UNIFORM_01: real ( kind = 8 ) vector of unit pseudorandom values.
        
- 
          RANK_ONE_PRINT_TEST prints the sums of rank one matrices.
        
- 
          RANK_ONE_TEST compares A to the sum of rank one matrices.
        
- 
          S_TO_I reads an integer value from a string.
        
- 
          SVD_PRODUCT_TEST tests that A = U * S * V.
        
- 
          TIMESTAMP prints the current YMDHMS date as a time stamp.
        
      You can go up one level to 
      the FORTRAN90 source codes.
    
    
    
      Last revised on 13 September 2006.