Blaze 3.9
RQ.h
Go to the documentation of this file.
1//=================================================================================================
33//=================================================================================================
34
35#ifndef _BLAZE_MATH_DENSE_RQ_H_
36#define _BLAZE_MATH_DENSE_RQ_H_
37
38
39//*************************************************************************************************
40// Includes
41//*************************************************************************************************
42
43#include <memory>
44#include <blaze/math/Aliases.h>
61#include <blaze/util/EnableIf.h>
62
63
64namespace blaze {
65
66//=================================================================================================
67//
68// RQ DECOMPOSITION FUNCTIONS
69//
70//=================================================================================================
71
72//*************************************************************************************************
75template< typename MT1, bool SO1, typename MT2, bool SO2, typename MT3, bool SO3 >
76void rq( const DenseMatrix<MT1,SO1>& A, DenseMatrix<MT2,SO2>& R, DenseMatrix<MT3,SO3>& Q );
78//*************************************************************************************************
79
80
81//*************************************************************************************************
93template< typename MT1 > // Type of matrix A
94inline auto rq_backend( MT1& A, const ElementType_t<MT1>* tau )
95 -> EnableIf_t<IsBuiltin_v< ElementType_t<MT1> > >
96{
97 orgrq( A, tau );
98}
100//*************************************************************************************************
101
102
103//*************************************************************************************************
115template< typename MT1 > // Type of matrix A
116inline auto rq_backend( MT1& A, const ElementType_t<MT1>* tau )
117 -> EnableIf_t<IsComplex_v< ElementType_t<MT1> > >
118{
119 ungrq( A, tau );
120}
122//*************************************************************************************************
123
124
125//*************************************************************************************************
174template< typename MT1 // Type of matrix A
175 , bool SO1 // Storage order of matrix A
176 , typename MT2 // Type of matrix R
177 , bool SO2 // Storage order of matrix R
178 , typename MT3 // Type of matrix Q
179 , bool SO3 > // Storage order of matrix Q
181{
184
191
194
195 using ET1 = ElementType_t<MT1>;
196
197 const size_t m( (*A).rows() );
198 const size_t n( (*A).columns() );
199 const size_t mindim( min( m, n ) );
200
201 if( ( !IsResizable_v<MT2> && ( (*R).rows() != m || (*R).columns() != mindim ) ) ||
202 ( !IsResizable_v<MT3> && ( (*Q).rows() != mindim || (*Q).columns() != n ) ) ) {
203 BLAZE_THROW_INVALID_ARGUMENT( "Dimensions of fixed size matrix do not match" );
204 }
205
206 if( IsSquare_v<MT2> && m != mindim ) {
207 BLAZE_THROW_INVALID_ARGUMENT( "Square matrix cannot be resized to m-by-min(m,n)" );
208 }
209
210 const std::unique_ptr<ET1[]> tau( new ET1[mindim] );
211 decltype(auto) r( derestrict( *R ) );
212
213 if( m < n )
214 {
215 (*Q) = A;
216 gerqf( *Q, tau.get() );
217
218 resize( *R, m, m, false );
219 reset( r );
220
221 for( size_t i=0UL; i<m; ++i ) {
222 for( size_t j=i; j<m; ++j ) {
223 r(i,j) = (*Q)(i,j+n-m);
224 }
225 }
226
227 rq_backend( *Q, tau.get() );
228 }
229 else
230 {
231 r = A;
232 gerqf( r, tau.get() );
233 (*Q) = submatrix( r, m-n, 0UL, n, n );
234 rq_backend( *Q, tau.get() );
235
236 for( size_t i=m-n; i<m; ++i ) {
237 for( size_t j=0UL; j<i+n-m; ++j ) {
238 reset( r(i,j) );
239 }
240 }
241 }
242}
243//*************************************************************************************************
244
245} // namespace blaze
246
247#endif
Constraint on the data type.
Header file for auxiliary alias declarations.
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.
Definition: Aliases.h:190
Constraint on the data type.
Header file for the EnableIf class template.
Constraint on the data type.
Header file for the IsResizable type trait.
Header file for the IsSquare type trait.
Constraint on the data type.
Constraint on the data type.
Constraint on the data type.
Constraint on the data type.
Base class for dense matrices.
Definition: DenseMatrix.h:82
Header file for the DenseMatrix base class.
Header file for the LAPACK RQ decomposition functions (gerqf)
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1339
void rq(const DenseMatrix< MT1, SO1 > &A, DenseMatrix< MT2, SO2 > &R, DenseMatrix< MT3, SO3 > &Q)
RQ decomposition of the given dense matrix.
Definition: RQ.h:180
void orgrq(blas_int_t m, blas_int_t n, blas_int_t k, float *A, blas_int_t lda, const float *tau, float *work, blas_int_t lwork, blas_int_t *info)
LAPACK kernel for the reconstruction of the orthogonal matrix Q from a RQ decomposition.
Definition: orgrq.h:125
void gerqf(blas_int_t m, blas_int_t n, float *A, blas_int_t lda, float *tau, float *work, blas_int_t lwork, blas_int_t *info)
LAPACK kernel for the RQ decomposition of the given dense single precision column-major matrix.
Definition: gerqf.h:152
void ungrq(blas_int_t m, blas_int_t n, blas_int_t k, complex< float > *A, blas_int_t lda, const complex< float > *tau, complex< float > *work, blas_int_t lwork, blas_int_t *info)
LAPACK kernel for the reconstruction of the orthogonal matrix Q from a RQ decomposition.
Definition: ungrq.h:127
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.
Definition: Symmetric.h:79
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.
Definition: BLASCompatible.h:61
#define BLAZE_CONSTRAINT_MUST_NOT_BE_HERMITIAN_MATRIX_TYPE(T)
Constraint on the data type.
Definition: Hermitian.h:79
#define BLAZE_CONSTRAINT_MUST_NOT_BE_STRICTLY_TRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.
Definition: StrictlyTriangular.h:81
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ADAPTOR_TYPE(T)
Constraint on the data type.
Definition: Adaptor.h:81
#define BLAZE_CONSTRAINT_MUST_NOT_BE_LOWER_MATRIX_TYPE(T)
Constraint on the data type.
Definition: Lower.h:81
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UNITRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.
Definition: UniTriangular.h:81
constexpr void reset(Matrix< MT, SO > &matrix)
Resetting the given matrix.
Definition: Matrix.h:806
void resize(Matrix< MT, SO > &matrix, size_t rows, size_t columns, bool preserve=true)
Changing the size of the matrix.
Definition: Matrix.h:1108
decltype(auto) submatrix(Matrix< MT, SO > &, RSAs...)
Creating a view on a specific submatrix of the given matrix.
Definition: Submatrix.h:181
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
Header file for the exception macros of the math module.
Header file for the LAPACK functions to reconstruct Q from a RQ decomposition (orgrq)
Header file for the LAPACK functions to reconstruct Q from a RQ decomposition (ungrq)
Header file for the generic min algorithm.
Header file for the implementation of the Submatrix view.