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