eigen常用操作

2023-10-28

基本操作


Eigen::Matrix<float, 2, 3> matrix_23; // 声明一个 2*3 的 float 矩阵
matrix_23.rows()          // size(C,1)  // 矩阵行数
matrix_23.cols()          // size(C,2)   // 矩阵列数
//定义动态矩阵

Eigen::MatrixXd matrix_x;

// 输入数据
matrix_23 << 1, 2, 3, 4, 5, 6;

// 用()访问矩阵中的元素
for (int i=0; i<1; i++)
for (int j=0; j<2; j++)
cout<<matrix_23(i,j)<<endl;


matrix_33.transpose() << endl; //转置
matrix_33.sum() << endl; //各元素和
matrix_33.trace() << endl; //迹
10*matrix_33 << endl; //数乘
matrix_33.inverse() << endl; //逆
matrix_33.determinant() << endl; //行列式

// 特征值
// 实对称矩阵可以保证对角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver ( matrix_33.transpose()*matrix_33 );
cout << "Eigen values = " << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = " << eigen_solver.eigenvectors() << endl;
//行列
m8.row(i);
m8.col(j);

//分块操作()
Matrix<double,p,q> m9 = m8.block(i,j,p,q);//起点(i, j),块大小(p, q),构建一个动态尺寸的block
m8.block<p,q>(i,j);
MatrixXf m7 = MatrixXf::Random(3,3);
m7.row(i);//矩阵第i行
m7.col(j);//矩阵第j列
m7.transpose();
m7.conjugate();//共轭
m7.adjoint(); //共轭转置
m7.minCoeff();//所有元素中最小元素
m7.maxCoeff();//所有元素中最大元素
m7.trace();//迹,对角元素的和
m7.sum(); //所有元素求和
m7.prod(); //所有元素求积
m7.mean(); //所有元素求平均

Vector3f v4(4,5,6);
Vector3f v5(7,8,9);
v4.dot(v5); //点乘
v4.cross(v5);//叉乘

/** 矩阵的+、-、数×、乘法
左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型),
其运算和int,float等基本类型相同。*/
Vector3f v6 = m7 * v5;
Matrix3f m_sum = m6 + m7;
Matrix3f m_dec = m6 - m7;
Matrix3f m_prod = 2.5 * m7;
Matrix3f m_prod2 = m6 * m7;
Matrix3d m_dev = m7 / 2.0;
//求两向量间距离
Eigen::Vector2f rad_dir(x1-x2,y1-y2);
Eigen::Vector2f Q=rad_dir.cwiseProduct(rad_dir);
//该表达式完成的功能是将rad_dir*rad_dir的对应点相乘。
//Q=((x1-x2)^2,(y1-y2)^2)
double a=Q.sum();
//该步实现的是a=(x1-x2)^2+(y1-y2)^2
double b=sqrt(a);
//该步实现的是b=sqrt((x1-x2)^2+(y1-y2)^2)

数据类型转换

 Type conversion
// Eigen                           // Matlab
A.cast<double>();                  // double(A)
A.cast<float>();                   // single(A)
A.cast<int>();                     // int32(A)
A.real();                          // real(A)
A.imag();                          // imag(A)

特殊矩阵生成

// Eigen                            // Matlab
MatrixXd::Identity(rows,cols)       // eye(rows,cols) 单位矩阵
C.setIdentity(rows,cols)            // C = eye(rows,cols) 单位矩阵
MatrixXd::Zero(rows,cols)           // zeros(rows,cols) 零矩阵
C.setZero(rows,cols)                // C = ones(rows,cols) 零矩阵
MatrixXd::Ones(rows,cols)           // ones(rows,cols)全一矩阵
C.setOnes(rows,cols)                // C = ones(rows,cols)全一矩阵
MatrixXd::Random(rows,cols)         // rand(rows,cols)*2-1        // 元素随机在-1->1
C.setRandom(rows,cols)              // C = rand(rows,cols)*2-1 同上
VectorXd::LinSpaced(size,low,high)  // linspace(low,high,size)'线性分布的数组
v.setLinSpaced(size,low,high)       // v = linspace(low,high,size)'线性分布的数组

高级操作

//vector转matrix,mean_acc_data是一个vector<vector<double>>数据,行列是对应的,外层vector是行,内层是列
Eigen::MatrixXd data_matrix(mean_acc_data.size(),mean_acc_data[0].size());
  for(int i =0; i< mean_acc_data.size();i++){
    
      data_matrix.row(i)= Eigen::VectorXd::Map(&mean_acc_data[i][0],mean_acc_data[i].size());
    
  }
a.norm();//返回矩阵a的Frobenius范数,即元素平方的和的平方根
u.norm();//返回向量b的模

MatrixXd Eigen_Vals_Diag(Vector.asDiagonal()); //.asDiagonal()返回以vector元素为主对角线元素的矩阵

旋转矩阵、四元数、旋转向量间的转换

rotation_matrix=rotation_vector.matrix();//旋转向量转旋转矩阵
Eigen::Vector3d eulerAngle=rotation_vector.matrix().eulerAngles(2,1,0);//旋转向量转欧拉角(Z-Y-X,即RPY)
Eigen::Quaterniond quaternion(rotation_vector);//旋转向量转四元数,vector是旋转向量
Eigen::AngleAxisd rotation_vector(rotation_matrix);// double旋转矩阵转旋转向量
Eigen::AngleAxisf rotation_vector(rotation_matrix);// float旋转矩阵转旋转向量
//1.使用旋转的角度和旋转轴向量(此向量为单位向量)来初始化角轴
AngleAxisd V1(M_PI / 4, Vector3d(0, 0, 1));//以(0,0,1)为旋转轴,旋转45度
cout << "Rotation_vector1" << endl << V1.matrix() << endl;

Eigen::Vector3d eulerAngle=rotation_matrix.eulerAngles(2,1,0);//旋转矩阵转欧拉角(Z-Y-X,即RPY)
Eigen::Quaterniond quaternion(rotation_matrix);//旋转矩阵转四元数
Eigen::AngleAxisd rotation_vector(quaternion);//四元数转旋转向量

rotation_matrix=quaternion.toRotationMatrix();//四元数转旋转矩阵
Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);//四元数转欧拉角(Z-Y-X,即RPY)

单个元素操作

// Vectorized operations on each element independently
// Eigen                  // Matlab
R = P.cwiseProduct(Q);    // R = P .* Q 对应点相乘
R = P.array() * s.array();// R = P .* s 对应点相乘
R = P.cwiseQuotient(Q);   // R = P ./ Q 对应点相除
R = P.array() / Q.array();// R = P ./ Q对应点相除
R = P.array() + s.array();// R = P + s对应点相加
R = P.array() - s.array();// R = P - s对应点相减
R.array() += s;           // R = R + s全加s
R.array() -= s;           // R = R - s全减s
R.array() < Q.array();    // R < Q 以下的都是针对矩阵的单个元素的操作
R.array() <= Q.array();   // R <= Q矩阵元素比较,会在相应位置置0或1
R.cwiseInverse();         // 1 ./ P
R.array().inverse();      // 1 ./ P
R.array().sin()           // sin(P) 
R.array().cos()           // cos(P)
R.array().pow(s)          // P .^ s
R.array().square()        // P .^ 2
R.array().cube()          // P .^ 3
R.cwiseSqrt()             // sqrt(P)
R.array().sqrt()          // sqrt(P)
R.array().exp()           // exp(P)
R.array().log()           // log(P)
R.cwiseMax(P)             // max(R, P) 对应取大
R.array().max(P.array())  // max(R, P) 对应取大
R.cwiseMin(P)             // min(R, P) 对应取小
R.array().min(P.array())  // min(R, P) 对应取小
R.cwiseAbs()              // abs(P) 绝对值
R.array().abs()           // abs(P) 绝对值
R.cwiseAbs2()             // abs(P.^2) 绝对值平方
R.array().abs2()          // abs(P.^2) 绝对值平方
(R.array() < s).select(P,Q);  // (R < s ? P : Q)这个也是单个元素的操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

eigen常用操作 的相关文章

随机推荐