Eigen (C++ 线性代数库)笔记

                     

贡献者: addis

1. Visual Studio 中使用 Eigen

   Eigen 的主页

  1. 首先下载 Eigen, 不需要任何安装.
  2. 在 Visual Studio 中创建新 Project, 在 Project 的属性中的 Include Directories 加入解压文件夹的目录.
  3. 在使用 Eigen 的代码中加入 #include <Eigen/Dense> 即可.

2. 基础

// Matrix Class
Matrix<double, 3, Dynamic> A
Matrix<double, Dynamic, Dynamic, Aligned | RowMajor> A
typedef Matrix<int, 4, 4> Matrix4i;
typedef Matrix<double, 4, 4> Matrix4d;
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
typedef Matrix<double, Dynamic, 1> VectorXd;
typedef Matrix<double, 1, Dynamic> RowVectorXd;

declaration & initialization
MatrixXd a(10,15); // No initialization
a.setRandom(m,n); 随机赋值
Matrix<>::setZero(); 把矩阵赋值为 0;
Matrix<>::setZero(m,n); 把矩阵赋值为 m*n 的 0 矩阵;

   以下函数用法类似 setOnes(); setConstant(); setIdentity(); setRandom(); setLinSpaced(); 注意其中 setConstant() 输入 1 个变量时与 fill() 功能相同,输入 3 个变量时最后一个为常数.setLinSpaced(size, val1, val2) 只能对 Vector 或者 RowVector 使用.如果想赋值给 MatrixXd, 可以用 MatrixXd a = VectorXd::LinSpaced(3, 3, 4); 对于整型,setLinSpaced 不保证最后一个值等于 val2, 而是保证间隔相等.这时候只能先生成 Xd, 然后 .cast<int>. * 逗号赋值都是 RowMaor 的,无论 a 是什么 major. a << 1,2,3,4;

3. operations

   获取信息

逐个矩阵元的运算

Aliasing

   如果矩阵同时出现在等号两边,就有可能出现 Aliasing. 例如 MatrixXi mat(3,3); mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2); 这时,要在等号右边的加上 .eval(). 特殊地,对于转置等,可以直接用 mat = mat.transposeInPlace(). 类似地有 adjointInPlace().

SVD (支持 complex)

   要用 SVD, 要 #include<Eigen/SVD>, 例程:

MatrixXd  A(3,3), U, V, X;
A << 1, 2, 3, 4, 5, 6, 7, 8, 9;
BDCSVD<MatrixXd> svd(A, ComputeThinU | ComputeThinV);
U = svd.matrixU(); V = svd.matrixV(); X = svd.singularValues();

4. 外部接口

   这里介绍如何直接操作 Matrix<> 底层的数据,以及如何将内存中已有的数据直接给 Eigen 使用而无需复制.

访问底层数据

使用内存数据


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利