贡献者: addis
Eigen 的主页。
#include <Eigen/Dense>
即可。
// 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;
获取信息
Matrix<>::size()
相当于 Matlab 的 numel(), 另外,rows() 和 cols() 分别是行数和列数。
Matrix<>::data()
可以获得 Matrix 数据的指针,用于直接读写矩阵数据。注意 rowwise 需要专门声明。也可以用 &
来获取矩阵元的地址。
Matrix<>::transpose()
复数矩阵共轭用 conjugate(), 共轭转置用 adjoint()
Matrix<>::sum(); Matrix<>::colwise().sum(); Matrix<>::rowwise().sum()
v.dot(w), v.cross(w)
类似的有 mean(), prod(), all(), any(), maxCoeff(), minCoeff()
获取子矩阵
对 Vector, 有 Matrix<>::head(n), tail(n), segment(n)
. 对 Matrix, 有 block(i,j,rows,cols)
, 有 row(i), col(j), topRows(n), middleRows(i, rows), bottomRows(n), leftCols(n), middleCols(j, cols), rightCols(n), topLeftCorner(rows,cols), bottomRightCorner(rows,cols)
等。
Matrix<>::cwiseAbs()
cwiseInverse(); cwiseMax(); cwiseMin(); cwiseSign(); cwiseSqrt(); Matrix<>::array()
用于把 Matrix 转换为 array, 逐个元素运算,或加减一个常数。如 Matrix<>::array().square()
round(); pow(); sqrt();
注意 array 可以直接赋值给 matrix.
mat.colwise() = v;
类似地,+=, -=
等也可以使用。
如果矩阵同时出现在等号两边,就有可能出现 Aliasing. 例如 MatrixXi mat(3,3); mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2);
这时,要在等号右边的加上 .eval()
. 特殊地,对于转置等,可以直接用 mat = mat.transposeInPlace()
. 类似地有 adjointInPlace()
.
要用 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();
这里介绍如何直接操作 Matrix<>
底层的数据,以及如何将内存中已有的数据直接给 Eigen 使用而无需复制。
Matrix<>::data()
可以返回第一个矩阵元的指针。然后就可以当做矩阵来用了。
Matrix<>::innerStride()
一律返回 1, outerStride()
返回 innerSize()
, 而 innerSize
对于 c-major 是 rows()
, 对于 r-major 是 cols()
. 这就说明矩阵的内存显然是连续的(无论怎么优化), 可以放心使用。
Matrix<>
到底是 col-major 还是 row-major, 默认是 col-major. 不推荐用 #define EIGEN_DEFAULT_TO_ROW_MAJOR
将默认改为 row-major. 建议用例如 typedef Matrix<double, Dynamic, Dynamic, Aligned | RowMajor> RMatrixXd.
Map<>
类即可,所有接受 Matrix<>
的函数同样也接受 Map<>
(除了自己写的函数)
Map<>
有三个模板参数,但是只需要用一个,即 Map<Matrix<>>
.
Map<MatrixXf> a(duuble* pa, rows,cols);
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利