我已经用Eigen实现了一段代码,我希望Eigen使用BLAS和LAPACK。
我在这里看到,这是可能的,但我不知道如何或在哪里将这些值/指令放在代码中。
我必须在某处说明EIGEN_USE_BLAS
的价值,但我不知道在哪里。
我已经看到 Eigen 的源代码包括 BLAS 和 LAPACK 的代码,但我完全忽略了它是否默认使用它还是什么。我正在使用特征 3.3.3。
您不必将这些指令放在代码中,而是使用这些宏编译代码。例如:
LAPACK_FLAGS=('-D EIGEN_USE_LAPACKE=1 -lm -lblas -llapack -llapacke')
g++ --std=c++11 eigenSVD.cpp -o eigenSVD.cpp ${LAPACK_FLAGS[@]}
看看Eigen/SVD
,如果你的代码是用EIGEN_USE_LAPACKE
编译的,你会看到Eigen-lapacke接口和lapacke头文件将被包括在内。
#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)
#ifdef EIGEN_USE_MKL
#include "mkl_lapacke.h"
#else
#include "src/misc/lapacke.h"
#endif
#include "src/SVD/JacobiSVD_LAPACKE.h"
#endif
好吧,我已经找到了解决方案
在.h
文件中包括以下内容:
// includes to make Eigen use BLAS+LAPACK
#include <complex>
#define EIGEN_SUPERLU_SUPPORT
#define EIGEN_USE_BLAS
#define EIGEN_USE_LAPACKE
#define LAPACK_COMPLEX_CUSTOM
#define lapack_complex_float std::complex<float>
#define lapack_complex_double std::complex<double>
// includes to call Eigen
#include <Eigen/Sparse>
#include <Eigen/StdVector>
无论使用复杂矩阵如何,复数包含都是必需的,因为 LAPACK 可以定义您所谓的复数类型。