fn_lu.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_lu
00018 //! @{
00019 
00020 
00021 //! immediate lower upper decomposition
00022 template<typename T1>
00023 inline
00024 void
00025 lu
00026   (
00027         Mat<typename T1::elem_type>&     L,
00028         Mat<typename T1::elem_type>&     U,
00029   const Base<typename T1::elem_type,T1>& X,
00030   const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
00031   )
00032   {
00033   arma_extra_debug_sigprint();
00034   
00035   typedef typename T1::elem_type eT;
00036   
00037   arma_debug_check( (&L == &U), "lu(): L and U are the same object");
00038   
00039   const unwrap_check<T1> tmp1(X.get_ref(), L);
00040   const Mat<eT>&     A = tmp1.M;
00041   
00042   const unwrap_check< Mat<eT> > tmp2(A, U);
00043   const Mat<eT>&            B = tmp2.M;
00044   
00045   auxlib::lu(L, U, B);
00046   }
00047 
00048 
00049 
00050 //! immediate lower upper decomposition, also providing the permutation matrix
00051 template<typename T1>
00052 inline
00053 void
00054 lu
00055   (
00056         Mat<typename T1::elem_type>&     L,
00057         Mat<typename T1::elem_type>&     U, 
00058         Mat<typename T1::elem_type>&     P,
00059   const Base<typename T1::elem_type,T1>& X,
00060   const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
00061   )
00062   {
00063   arma_extra_debug_sigprint();
00064   
00065   typedef typename T1::elem_type eT;
00066   
00067   arma_debug_check( ( (&L == &U) || (&L == &P) || (&U == &P) ), "lu(): two or more output objects are the same object");
00068 
00069   const unwrap_check<T1> tmp1(X.get_ref(), L);
00070   const Mat<eT>&     A = tmp1.M;
00071   
00072   const unwrap_check< Mat<eT> > tmp2(A, U);
00073   const Mat<eT>&            B = tmp2.M;
00074   
00075   const unwrap_check< Mat<eT> > tmp3(B, P);
00076   const Mat<eT>&            C = tmp3.M;
00077   
00078   auxlib::lu(L, U, P, C);
00079   }
00080 
00081 
00082 //! @}