35#ifndef EIGEN_QR_LAPACKE_H
36#define EIGEN_QR_LAPACKE_H
39#include "./InternalHeaderCheck.h"
45namespace lapacke_helpers {
47template <
typename MatrixQR,
typename HCoeffs>
49 static void run(MatrixQR& mat, HCoeffs& hCoeffs, Index maxBlockSize = 32,
typename MatrixQR::Scalar* tempData = 0) {
50 lapack_int m = to_lapack(mat.rows());
51 lapack_int n = to_lapack(mat.cols());
52 lapack_int lda = to_lapack(mat.outerStride());
53 lapack_int matrix_order = lapack_storage_of(mat);
54 lapack_int info = geqrf(matrix_order, m, n, to_lapack(mat.data()), lda, to_lapack(hCoeffs.data()));
58 householder_qr_inplace_blocked<MatrixQR, HCoeffs, typename MatrixQR::Scalar, false>::run(mat, hCoeffs,
59 maxBlockSize, tempData);
62 eigen_assert(info == 0);
63 hCoeffs.adjointInPlace();
70#define EIGEN_LAPACKE_HH_QR(EIGTYPE) \
71 template <typename MatrixQR, typename HCoeffs> \
72 struct householder_qr_inplace_blocked<MatrixQR, HCoeffs, EIGTYPE, true> \
73 : public lapacke_helpers::lapacke_hqr<MatrixQR, HCoeffs> {};
75EIGEN_LAPACKE_HH_QR(
double)
76EIGEN_LAPACKE_HH_QR(
float)
77EIGEN_LAPACKE_HH_QR(std::complex<double>)
78EIGEN_LAPACKE_HH_QR(std::complex<float>)
80#undef EIGEN_LAPACKE_HH_QR