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,地址是http://software.intel.com/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 类对象赋值。
例子:

//定义 3x3 矩阵 m 为单位矩阵
Matrix3d m = Matrix3d::Identity();
//函数 m.col(1) 返回对矩阵 m 第 2 列(从 0 开始)列向量的引用,并且用一个新的列向量对此列赋值
//最终 m 的数值为 {{1, 4, 0}, {0, 5, 0}, {0, 6, 1}}
m.col(1) = Vector3d(4, 5, 6);

可以和 Vector& Vector::normalize() 联用。即

m.col(1).normalize()

表示对矩阵 m 列标为 1 的列向量进行单位化。

4. Eigen 矩阵可以使用的优化 Gram-Schmidt 正交化算法

void orthonormalize(Eigen::MatrixXd& ColVecs)
{
	ColVecs.col(0).normalize();
	double temp;
	for(std::size_t k = 0; k != ColVecs.cols() - 1; ++k)
	{
		for(std::size_t j = 0; j != k + 1; ++j)
		{
			temp = ColVecs.col(j).transpose() * ColVecs.col(k + 1);
			ColVecs.col(k + 1) -= ColVecs.col(j) * temp;
		}
		ColVecs.col(k + 1).normalize();
	}
}

5. 由 Vector 构建对角矩阵的方法,其中 Vector 中的元素占据矩阵的主对角线

MatrixXd Eigen_Vals_Diag(Vector.asDiagonal());

生成的对角矩阵名为 Eigen_Vals_Diag, 由向量(列向量或者行向量均可)Vector 中的元素构建。

你可能感兴趣的:(数值计算算法)