getri.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_LAPACK_GETRI_H_
36 #define _BLAZE_MATH_LAPACK_GETRI_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <boost/cast.hpp>
50 #include <blaze/util/Assert.h>
51 #include <blaze/util/Complex.h>
52 #include <blaze/util/Exception.h>
54 #include <blaze/util/UniqueArray.h>
55 
56 
57 namespace blaze {
58 
59 //=================================================================================================
60 //
61 // LAPACK FORWARD DECLARATIONS
62 //
63 //=================================================================================================
64 
65 //*************************************************************************************************
67 extern "C" {
68 
69 void sgetri_( int* n, float* A, int* lda, int* ipiv, float* work, int* lwork, int* info );
70 void dgetri_( int* n, double* A, int* lda, int* ipiv, double* work, int* lwork, int* info );
71 void cgetri_( int* n, float* A, int* lda, int* ipiv, float* work, int* lwork, int* info );
72 void zgetri_( int* n, double* A, int* lda, int* ipiv, double* work, int* lwork, int* info );
73 
74 }
76 //*************************************************************************************************
77 
78 
79 
80 
81 //=================================================================================================
82 //
83 // LAPACK LU-BASED INVERSION FUNCTIONS (GETRI)
84 //
85 //=================================================================================================
86 
87 //*************************************************************************************************
90 inline void getri( int n, float* A, int lda, const int* ipiv, float* work, int lwork, int* info );
91 
92 inline void getri( int n, double* A, int lda, const int* ipiv, double* work, int lwork, int* info );
93 
94 inline void getri( int n, complex<float>* A, int lda, const int* ipiv,
95  complex<float>* work, int lwork, int* info );
96 
97 inline void getri( int n, complex<double>* A, int lda, const int* ipiv,
98  complex<double>* work, int lwork, int* info );
99 
100 template< typename MT, bool SO >
101 inline void getri( DenseMatrix<MT,SO>& A, const int* ipiv );
103 //*************************************************************************************************
104 
105 
106 //*************************************************************************************************
141 inline void getri( int n, float* A, int lda, const int* ipiv, float* work, int lwork, int* info )
142 {
143  sgetri_( &n, A, &lda, const_cast<int*>( ipiv ), work, &lwork, info );
144 }
145 //*************************************************************************************************
146 
147 
148 //*************************************************************************************************
183 inline void getri( int n, double* A, int lda, const int* ipiv, double* work, int lwork, int* info )
184 {
185  dgetri_( &n, A, &lda, const_cast<int*>( ipiv ), work, &lwork, info );
186 }
187 //*************************************************************************************************
188 
189 
190 //*************************************************************************************************
225 inline void getri( int n, complex<float>* A, int lda, const int* ipiv,
226  complex<float>* work, int lwork, int* info )
227 {
228  BLAZE_STATIC_ASSERT( sizeof( complex<float> ) == 2UL*sizeof( float ) );
229 
230  cgetri_( &n, reinterpret_cast<float*>( A ), &lda, const_cast<int*>( ipiv ),
231  reinterpret_cast<float*>( work ), &lwork, info );
232 }
233 //*************************************************************************************************
234 
235 
236 //*************************************************************************************************
271 inline void getri( int n, complex<double>* A, int lda, const int* ipiv,
272  complex<double>* work, int lwork, int* info )
273 {
274  BLAZE_STATIC_ASSERT( sizeof( complex<double> ) == 2UL*sizeof( double ) );
275 
276  zgetri_( &n, reinterpret_cast<double*>( A ), &lda, const_cast<int*>( ipiv ),
277  reinterpret_cast<double*>( work ), &lwork, info );
278 }
279 //*************************************************************************************************
280 
281 
282 //*************************************************************************************************
316 template< typename MT // Type of the dense matrix
317  , bool SO > // Storage order of the dense matrix
318 inline void getri( DenseMatrix<MT,SO>& A, const int* ipiv )
319 {
320  using boost::numeric_cast;
321 
326 
327  typedef typename MT::ElementType ET;
328 
329  if( !isSquare( ~A ) ) {
330  BLAZE_THROW_INVALID_ARGUMENT( "Invalid non-square matrix provided" );
331  }
332 
333  int n ( numeric_cast<int>( (~A).columns() ) );
334  int lda ( numeric_cast<int>( (~A).spacing() ) );
335  int info( 0 );
336 
337  if( n == 0 ) {
338  return;
339  }
340 
341  int lwork( n*lda );
342  const UniqueArray<ET> work( new ET[lwork] );
343 
344  getri( n, (~A).data(), lda, ipiv, work.get(), lwork, &info );
345 
346  BLAZE_INTERNAL_ASSERT( info >= 0, "Invalid argument for matrix inversion" );
347 
348  if( info > 0 ) {
349  BLAZE_THROW_INVALID_ARGUMENT( "Inversion of singular matrix failed" );
350  }
351 }
352 //*************************************************************************************************
353 
354 } // namespace blaze
355 
356 #endif
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exceptionThis macro encapsulates the default way of...
Definition: Exception.h:187
Constraint on the data type.
Log level for high-level information.
Definition: LogLevel.h:80
#define BLAZE_CONSTRAINT_MUST_HAVE_MUTABLE_DATA_ACCESS(T)
Constraint on the data type.In case the given data type T does not provide low-level data access to m...
Definition: MutableDataAccess.h:79
BLAZE_ALWAYS_INLINE bool isSquare(const Matrix< MT, SO > &matrix)
Checks if the given matrix is a square matrix.
Definition: Matrix.h:603
#define BLAZE_CONSTRAINT_MUST_NOT_BE_COMPUTATION_TYPE(T)
Constraint on the data type.In case the given data type T is a computational expression (i...
Definition: Computation.h:118
Pointer get() const
Returns a pointer to the managed array.
Definition: UniqueArray.h:245
Constraint on the data type.
#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:118
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Compile time assertion.
Header file for the DenseMatrix base class.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2586
Constraint on the data type.
Constraint on the data type.
void getri(int n, float *A, int lda, const int *ipiv, float *work, int lwork, int *info)
LAPACK kernel for the inversion of the given dense general single precision column-major square matri...
Definition: getri.h:141
const bool spacing
Adding an additional spacing line between two log messages.This setting gives the opportunity to add ...
Definition: Logging.h:70
Header file for run time assertion macros.
Header file for the UniqueArray smart pointer class.
#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:79
Header file for the IsRowMajorMatrix type trait.
BLAZE_ALWAYS_INLINE size_t columns(const Matrix< MT, SO > &matrix)
Returns the current number of columns of the matrix.
Definition: Matrix.h:324
Header file for the complex data type.
Header file for exception macros.
#define BLAZE_STATIC_ASSERT(expr)
Compile time assertion macro.In case of an invalid compile time expression, a compilation error is cr...
Definition: StaticAssert.h:143
Scope-limited management of dynamically allocated arrays.The UniqueArray class implements a scope-res...
Definition: UniqueArray.h:97
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101