fn_lu.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2009 NICTA
00002 // 
00003 // Authors:
00004 // - Conrad Sanderson (conradsand at ieee dot org)
00005 // 
00006 // This file is part of the Armadillo C++ library.
00007 // It is provided without any warranty of fitness
00008 // for any purpose. You can redistribute this file
00009 // and/or modify it under the terms of the GNU
00010 // Lesser General Public License (LGPL) as published
00011 // by the Free Software Foundation, either version 3
00012 // of the License or (at your option) any later version.
00013 // (see http://www.opensource.org/licenses for more info)
00014 
00015 
00016 //! \addtogroup fn_lu
00017 //! @{
00018 
00019 
00020 //! immediate lower upper decomposition
00021 template<typename T1>
00022 inline
00023 void
00024 lu(Mat<typename T1::elem_type>& L, Mat<typename T1::elem_type>& U, const Base<typename T1::elem_type,T1>& X)
00025   {
00026   arma_extra_debug_sigprint();
00027   
00028   typedef typename T1::elem_type eT;
00029   
00030   arma_debug_check( (&L == &U), "lu(): L and U are the same object");
00031   
00032   const unwrap_check<T1> tmp1(X.get_ref(), L);
00033   const Mat<eT>&     A = tmp1.M;
00034   
00035   const unwrap_check< Mat<eT> > tmp2(A, U);
00036   const Mat<eT>&            B = tmp2.M;
00037   
00038   auxlib::lu(L, U, B);
00039   }
00040 
00041 
00042 
00043 //! immediate lower upper decomposition, also providing the permutation matrix
00044 template<typename T1>
00045 inline
00046 void
00047 lu(Mat<typename T1::elem_type>& L, Mat<typename T1::elem_type>& U, Mat<typename T1::elem_type>& P, const Base<typename T1::elem_type,T1>& X)
00048   {
00049   arma_extra_debug_sigprint();
00050   
00051   typedef typename T1::elem_type eT;
00052   
00053   arma_debug_check( ( (&L == &U) || (&L == &P) || (&U == &P) ), "lu(): two or more output objects are the same object");
00054 
00055   const unwrap_check<T1> tmp1(X.get_ref(), L);
00056   const Mat<eT>&     A = tmp1.M;
00057   
00058   const unwrap_check< Mat<eT> > tmp2(A, U);
00059   const Mat<eT>&            B = tmp2.M;
00060   
00061   const unwrap_check< Mat<eT> > tmp3(B, P);
00062   const Mat<eT>&            C = tmp3.M;
00063   
00064   auxlib::lu(L, U, P, C);
00065   }
00066 
00067 
00068 //! @}