C++矩阵计算库Eigen使⽤笔记(⼀)
1. intel Math Kernel Library 的调⽤
在 #include 任何 Eigen 库的头⽂件之前,定义宏
#define EIGEN_USE_MKL_ALL
可以根据⾃⼰的需要单独定义所需的 MKL 部分。可⽤的宏是
EIGEN_USE_BLAS 使⽤ BLAS Level 2 与 BLAS Level 3 的算法;
EIGEN_USE_LAPACKE 通过 intel MKL C 接⼝,使⽤扩展的 LAPACK 算法;
EIGEN_USE_LAPACKE_STRICT 使⽤更加稳定的 LAPACK 算法(⽐如⽤ gesvd 代替 Jacobi 旋转),⼀般情况下⽆需使⽤此选项;EIGEN_USE_MKL_VML 使⽤ MKL 函数的⽮量化优化;
EIGEN_USE_MKL_ALL 相当于同时定义了 EIGEN_USE_BLAS, EIGEN_USE_LAPACKE 和 EIGEN_USE_MKL_VML.
务必注意,宏的定义必须在引⽤任何 Eigen 头⽂件之前,否则调⽤是⽆效的。64位操作系统上的 MKL
数据类型接⼝选择 lp64,Eigen 暂时不⽀持 ilp64 类型。
intel Math Kernel Library 的库⽂件链接⽅法,可以参考 intel MKL Linking Advisor,地址是software.intel/en-
us/articles/intel-mkl-link-line-advisor
2. 向量的单位化
Vector& Vector::normalize();
对 *this 向量(列向量与⾏向量均可)进⾏单位化(即归⼀化)。此操作会直接改变 *this 向量⾃⾝。
3. 获取列向量
Vector& Matrix::col(std::size_t index);
const Vector& Matrix::col(std::size_t index) const;
类 Matrix 的成员函数。返回值为 *this 的 Matrix 中第 index 列列向量的引⽤,此列向量可以作为右值赋值给⼀个⼤⼩为 *this 矩阵的⾏数的 Vector 类对象,也可以作为左值被⼀个同样⼤⼩的 Vector 类对identity matrix是什么意思
象赋值。
例⼦:
//定义 3x3 矩阵 m 为单位矩阵
Matrix3d m = Matrix3d::Identity();
//函数 m.col(1) 返回对矩阵 m 第 2 列(从 0 开始)列向量的引⽤,并且⽤⼀个新的列向量对此列赋值
//最终 m 的数值为 {{1, 4, 0}, {0, 5, 0}, {0, 6, 1}}
可以和 Vector& Vector::normalize() 联⽤。即
表⽰对矩阵 m 列标为 1 的列向量进⾏单位化。
4. Eigen 矩阵可以使⽤的优化 Gram-Schmidt 正交化算法
void orthonormalize(Eigen::MatrixXd& ColVecs)
{
double temp;
for(std::size_t k = 0; k != ls() - 1; ++k)
{
for(std::size_t j = 0; j != k + 1; ++j)
{
temp = l(j).transpose() * l(k + 1);
}
}
}
5. 由 Vector 构建对⾓矩阵的⽅法,其中 Vector 中的元素占据矩阵的主对⾓线MatrixXd Eigen_Vals_Diag(Vector.asDiagonal());
⽣成的对⾓矩阵名为 Eigen_Vals_Diag, 由向量(列向量或者⾏向量均可)Vector 中的元素构建。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。