fn_solve.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2010 NICTA and the authors listed below
00002 // http://nicta.com.au
00003 // 
00004 // Authors:
00005 // - Conrad Sanderson (conradsand at ieee dot org)
00006 // 
00007 // This file is part of the Armadillo C++ library.
00008 // It is provided without any warranty of fitness
00009 // for any purpose. You can redistribute this file
00010 // and/or modify it under the terms of the GNU
00011 // Lesser General Public License (LGPL) as published
00012 // by the Free Software Foundation, either version 3
00013 // of the License or (at your option) any later version.
00014 // (see http://www.opensource.org/licenses for more info)
00015 
00016 
00017 //! \addtogroup fn_solve
00018 //! @{
00019 
00020 
00021 
00022 //! Solve a system of linear equations, i.e., A*X = B, where X is unknown.
00023 //! For a square matrix A, this function is conceptually the same as X = inv(A)*B,
00024 //! but is done more efficiently.
00025 //! The number of rows in A and B must be the same.
00026 //! B can be either a column vector or a matrix.
00027 //! This function will also try to provide approximate solutions
00028 //! to under-determined as well as over-determined systems (non-square A matrices).
00029 
00030 template<typename eT, typename T1, typename T2>
00031 inline
00032 bool
00033 solve(Mat<eT>& X, const Base<eT,T1>& A_in, const Base<eT,T2>& B_in)
00034   {
00035   arma_extra_debug_sigprint();
00036   
00037   const unwrap<T1> tmp1(A_in.get_ref());
00038   const unwrap<T2> tmp2(B_in.get_ref());
00039   
00040   const Mat<eT>& A = tmp1.M;
00041   const Mat<eT>& B = tmp2.M;
00042   
00043   arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in A and B must be the same" );
00044   
00045   if(A.n_rows == A.n_cols)
00046     {
00047     return auxlib::solve(X, A, B);
00048     }
00049   else
00050   if(A.n_rows > A.n_cols)
00051     {
00052     arma_extra_debug_print("solve(): detected over-determined system");
00053     return auxlib::solve_od(X, A, B);
00054     }
00055   else
00056     {
00057     arma_extra_debug_print("solve(): detected under-determined system");
00058     return auxlib::solve_ud(X, A, B);
00059     }
00060   }
00061 
00062 
00063 
00064 template<typename eT, typename T1, typename T2>
00065 inline
00066 Mat<eT>
00067 solve(const Base<eT,T1>& A_in, const Base<eT,T2>& B_in)
00068   {
00069   arma_extra_debug_sigprint();
00070   
00071   Mat<eT> X;
00072   bool info = solve(X, A_in, B_in);
00073   
00074   if(info == false)
00075     {
00076     arma_print("solve(): solution not found");
00077     }
00078   
00079   return X;
00080   }
00081 
00082 
00083 
00084 //! @}