LQ.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_DENSE_LQ_H_
36 #define _BLAZE_MATH_DENSE_LQ_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <memory>
44 #include <blaze/math/Aliases.h>
52 #include <blaze/math/Exception.h>
54 #include <blaze/math/Functions.h>
62 #include <blaze/util/EnableIf.h>
63 
64 
65 namespace blaze {
66 
67 //=================================================================================================
68 //
69 // LQ DECOMPOSITION FUNCTIONS
70 //
71 //=================================================================================================
72 
73 //*************************************************************************************************
76 template< typename MT1, bool SO1, typename MT2, bool SO2, typename MT3, bool SO3 >
77 void lq( const DenseMatrix<MT1,SO1>& A, DenseMatrix<MT2,SO2>& Q, DenseMatrix<MT3,SO3>& R );
79 //*************************************************************************************************
80 
81 
82 //*************************************************************************************************
94 template< typename MT1 > // Type of matrix A
95 inline EnableIf_<IsBuiltin< ElementType_<MT1> > >
96  lq_backend( MT1& A, const ElementType_<MT1>* tau )
97 {
98  orglq( A, tau );
99 }
101 //*************************************************************************************************
102 
103 
104 //*************************************************************************************************
116 template< typename MT1 > // Type of matrix A
117 inline EnableIf_<IsComplex< ElementType_<MT1> > >
118  lq_backend( MT1& A, const ElementType_<MT1>* tau )
119 {
120  unglq( A, tau );
121 }
123 //*************************************************************************************************
124 
125 
126 //*************************************************************************************************
174 template< typename MT1 // Type of matrix A
175  , bool SO1 // Storage order of matrix A
176  , typename MT2 // Type of matrix L
177  , bool SO2 // Storage order of matrix L
178  , typename MT3 // Type of matrix Q
179  , bool SO3 > // Storage order of matrix Q
181 {
184 
190 
193 
194  typedef ElementType_<MT1> ET1;
195 
196  const size_t m( (~A).rows() );
197  const size_t n( (~A).columns() );
198  const size_t mindim( min( m, n ) );
199 
200  if( ( !IsResizable<MT2>::value && ( (~L).rows() != m || (~L).columns() != mindim ) ) ||
201  ( !IsResizable<MT3>::value && ( (~Q).rows() != mindim || (~Q).columns() != n ) ) ) {
202  BLAZE_THROW_INVALID_ARGUMENT( "Dimensions of fixed size matrix do not match" );
203  }
204 
205  if( IsSquare<MT2>::value && m != mindim ) {
206  BLAZE_THROW_INVALID_ARGUMENT( "Square matrix cannot be resized to m-by-min(m,n)" );
207  }
208 
209  const std::unique_ptr<ET1[]> tau( new ET1[mindim] );
210  DerestrictTrait_<MT3> l( derestrict( ~L ) );
211 
212  if( m < n )
213  {
214  (~Q) = A;
215  gelqf( ~Q, tau.get() );
216 
217  resize( ~L, m, m );
218  reset( l );
219 
220  for( size_t i=0UL; i<m; ++i ) {
221  for( size_t j=0UL; j<min(i+1UL,n); ++j ) {
222  l(i,j) = (~Q)(i,j);
223  }
224  }
225 
226  lq_backend( ~Q, tau.get() );
227  }
228  else
229  {
230  l = A;
231  gelqf( l, tau.get() );
232  (~Q) = submatrix( l, 0UL, 0UL, n, n );
233  lq_backend( ~Q, tau.get() );
234 
235  for( size_t i=0UL; i<m; ++i ) {
236  for( size_t j=i+1UL; j<n; ++j ) {
237  reset( l(i,j) );
238  }
239  }
240  }
241 }
242 //*************************************************************************************************
243 
244 } // namespace blaze
245 
246 #endif
Header file for the implementation of the Submatrix view.
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.This macro encapsulates the default way o...
Definition: Exception.h:235
Header file for auxiliary alias declarations.
Header file for mathematical functions.
typename DerestrictTrait< T >::Type DerestrictTrait_
Auxiliary alias declaration for the DerestrictTrait type trait.The DerestrictTrait_ alias declaration...
Definition: DerestrictTrait.h:110
void orglq(int m, int n, int k, float *A, int lda, const float *tau, float *work, int lwork, int *info)
LAPACK kernel for the reconstruction of the orthogonal matrix Q from a LQ decomposition.
Definition: orglq.h:117
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:533
const ElementType_< MT > min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:1669
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UNITRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a lower or upper unitriangular matrix ty...
Definition: UniTriangular.h:81
Constraint on the data type.
Header file for the LAPACK functions to reconstruct Q from a LQ decomposition (unglq) ...
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ADAPTOR_TYPE(T)
Constraint on the data type.In case the given data type T is an adaptor type (as for instance LowerMa...
Definition: Adaptor.h:81
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Constraint on the data type.
Header file for the IsSquare type trait.
Constraint on the data type.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Header file for the LAPACK functions to reconstruct Q from a LQ decomposition (orglq) ...
Header file for the DenseMatrix base class.
typename T::ElementType ElementType_
Alias declaration for nested ElementType type definitions.The ElementType_ alias declaration provides...
Definition: Aliases.h:163
Compile time check for square matrices.This type trait tests whether or not the given template parame...
Definition: IsSquare.h:88
BLAZE_ALWAYS_INLINE size_t columns(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of columns of the matrix.
Definition: Matrix.h:330
Header file for the exception macros of the math module.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UPPER_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a upper triangular matrix type...
Definition: Upper.h:81
BLAZE_ALWAYS_INLINE void resize(Matrix< MT, SO > &matrix, size_t rows, size_t columns, bool preserve=true)
Changing the size of the matrix.
Definition: Matrix.h:538
Header file for the EnableIf class template.
Header file for the DerestrictTrait class template.
Constraint on the data type.
Compile time check for resizable data types.This type trait tests whether the given data type is a re...
Definition: IsResizable.h:75
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a symmetric matrix type, a compilation error is created.
Definition: Symmetric.h:79
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.In case the given data type T is not a BLAS compatible data type (i...
Definition: BLASCompatible.h:61
Constraint on the data type.
void lq(const DenseMatrix< MT1, SO1 > &A, DenseMatrix< MT2, SO2 > &Q, DenseMatrix< MT3, SO3 > &R)
LQ decomposition of the given dense matrix.
Definition: LQ.h:180
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_STRICTLY_TRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a strictly lower or upper triangular mat...
Definition: StrictlyTriangular.h:81
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of rows of the matrix.
Definition: Matrix.h:314
void gelqf(int m, int n, float *A, int lda, float *tau, float *work, int lwork, int *info)
LAPACK kernel for the LQ decomposition of the given dense single precision column-major matrix...
Definition: gelqf.h:143
void unglq(int m, int n, int k, complex< float > *A, int lda, const complex< float > *tau, complex< float > *work, int lwork, int *info)
LAPACK kernel for the reconstruction of the orthogonal matrix Q from a LQ decomposition.
Definition: unglq.h:117
#define BLAZE_CONSTRAINT_MUST_NOT_BE_HERMITIAN_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is an Hermitian matrix type, a compilation error is created.
Definition: Hermitian.h:79
SubmatrixExprTrait_< MT, unaligned > submatrix(Matrix< MT, SO > &matrix, size_t row, size_t column, size_t m, size_t n)
Creating a view on a specific submatrix of the given matrix.
Definition: Submatrix.h:167
Header file for the IsResizable type trait.
Header file for the LAPACK LQ decomposition functions (gelqf)