text: /***************************************************************************
  * SVD.h                                                                    *
  *                                                                          *
  * Singular Value Decomposition.                                            *
  *                                                                          *
  *   HISTORY                                                                *
  *      Name    Date          Description                                   *
  *                                                                          *
  *      arvo    08/22/2000    Split off from Matrix.h                       *
  *      arvo    06/28/1993    Rewritten from "Numerical Recipes" C-code.    *
  *                                                                          *
  *--------------------------------------------------------------------------*
  * Copyright (C) 2000, James Arvo                                           *
  *                                                                          *
  * This program is free software; you can redistribute it and/or modify it  *
  * under the terms of the GNU General Public License as published by the    *
  * Free Software Foundation.  See http://www.fsf.org/copyleft/gpl.html      *
  *                                                                          *
  * This program is distributed in the hope that it will be useful, but      *
  * WITHOUT EXPRESS OR IMPLIED WARRANTY of merchantability or fitness for    *
  * any particular purpose.  See the GNU General Public License for more     *
  * details.                                                                 *
  *                                                                          *
  ***************************************************************************/
  #ifndef __SVD_INCLUDED__
  #define __SVD_INCLUDED__
  
  #include "Vector.h"
  #include "Matrix.h"
  
  namespace ArvoMath {
  
  	class SVD {
  	public:
  		SVD( );
  		SVD( const SVD    & );  // Copies the decomposition.
  		SVD( const Matrix & );  // Performs the decomposition.
  		~SVD() {};
  		const Matrix &Q( double epsilon = 0.0 ) const;
  		const Matrix &D( double epsilon = 0.0 ) const;
  		const Matrix &R( double epsilon = 0.0 ) const;
  		const Matrix &PseudoInverse( double epsilon = 0.0 );
  		int   Rank( double epsilon = 0.0 ) const;
  		void  operator=( const Matrix & );  // Performs the decomposition.
  	private:
  		int Decompose( Matrix &Q, Matrix &D, Matrix &R );
  		Matrix Q_;
  		Matrix D_;
  		Matrix R_;
  		Matrix P_; // Pseudo inverse.
  		int    error;
  	};
  };
  #endif
  