Eigen中矩阵相关的函数的意思

MatrixXd::Identity(rows,cols)       //返回一个大小为 rows x cols 的单位矩阵(对角线元素为 1,其他元素为 0)。
C.setIdentity(rows,cols)            //将C矩阵设置为rows x cols 的主对角元素为1的单位矩阵
MatrixXd::Zero(rows,cols)           //设置rows x cols 的的零矩阵
C.setZero(rows,cols)                
MatrixXd::Ones(rows,cols)           //设置为全一rows x cols 矩阵
C.setOnes(rows,cols)                
MatrixXd::Random(rows,cols)         //返回一个大小为 rows x cols 的矩阵,矩阵中的每个元素是一个在 (-1, 1) 区间内均匀分布的随机数
C.setRandom(rows,cols)              
VectorXd::LinSpaced(size,low,high)  //返回一个包含 size 个元素的向量,元素在 low 和 high 之间线性均匀分布
v.setLinSpaced(size,low,high)       

C.resize(rows,cols)                //将C矩阵重新定义大小为rows x cols 的矩阵,但是假如其中C的大小不符合重新定义的矩阵将会出错,一般使用在动态定义矩阵中,如Matrix<double, 3, Dynamic> B;设置的是三行动态列数B双精度矩阵,

C.fill(num)                //将矩阵C的数据全部改为num

Matrix3d A;        //则是定义一个3*3的整型矩阵
Matrix<double, 3, 3, RowMajor> E    //定义一个3*3的矩阵,使用行优先的存储序列,正常情况是列优先
Vector3f x, y, z;        //等价于 Matrix<float, 3, 1>,定义了一个 3*1 的单精度浮点列向量,这里的f换为d就是表示的整型的矩阵
RowVector3f a, b, c;       //定义了一个1*3的单精度行矩阵,当然改变数字的大小对应不同的向量

transpose()conjugate()adjoint()分别对应矩阵的转置矩阵,共轭矩阵,伴随矩阵,使用时也只需要在矩阵后面家“.transpose()”即可,如x.transpose()

R.diagonal();          //提取矩阵 R 的主对角线元素,返回一个包含对角线元素的向量
x.asDiagonal();       //将向量 x 转换为对角矩阵,即对角线上是向量 x 的元素,其余元素为 0
R.transpose().colwise().reverse();    //先对矩阵 R 进行转置,然后再对转置后的矩阵按列进行反转(从上到下交换元素),这相当于将矩阵逆时针旋转 90 度
matrix.block<p,q>(i,j);     //这里的matrix可以是定义的任何矩阵,该代码表示从源矩阵的i行j列,取一个p行,q列的子矩阵
matrix.block(i,j,p,q);     //和上面一样,只是不同表达形式,且源矩阵也不会发生改变
vector.head(n);        //vector也可以是任何向量,表示获取向量的前n个元素
vector.tail(n);        //获取向量尾部的n个元素:
vector.segment(i,n);        //获取从向量的第i个元素开始的n个元素
P.leftCols<cols>()                 // 返回矩阵左侧开始的cols列
P.leftCols(cols)                   // 同上
P.middleCols<cols>(j)              // 返回第j列开始的cols列
P.middleCols(j, cols)              // 同上
P.rightCols<cols>()                // 返回矩阵右侧开始的cols列
P.rightCols(cols)                  // 
P.topRows<rows>()                  // 返回从顶部开始的rows行
P.topRows(rows)                    // 
P.middleRows<rows>(i)              // 返回从i行开始的rows列
P.middleRows(i, rows)              // 
P.bottomRows<rows>()               // 返回从底部开始rows行
P.bottomRows(rows)                 // 
P.topLeftCorner(rows, cols)        // 返回矩阵 P 的左上角部分,大小为 rows x cols
P.topRightCorner(rows, cols)       // 返回矩阵 P 的右上角部分,大小为 rows x cols
P.bottomLeftCorner(rows, cols)     // 返回矩阵 P 的左下角部分,大小为 rows x cols
P.bottomRightCorner(rows, cols)    // 返回矩阵 P 的右下角部分,大小为 rows x cols
P.topLeftCorner<rows,cols>()       // 
P.topRightCorner<rows,cols>()      // 
P.bottomLeftCorner<rows,cols>()    // 
P.bottomRightCorner<rows,cols>()   // 
R = P.cwiseProduct(Q);    //  表示矩阵 P 和 Q 的逐元素相乘
R = P.array() * s.array();// 允许将矩阵 P 和标量 s 逐元素相乘。这里将 P 转换为数组模式
R = P.cwiseQuotient(Q);   // 表示矩阵 P 和 Q 的逐元素相除
R = P.array() / Q.array();// 通过将 P 和 Q 转换为数组,进行逐元素相除
R = P.array() + s.array();// 将 P 和标量 s 逐元素相加
R = P.array() - s.array();// 将 P 和标量 s 逐元素相减
R.array() += s;           // 将标量 s 加到 R 的每个元素上
R.array() -= s;           // 将标量 s 从 R 的每个元素中减去
R.array() < Q.array();    // 返回布尔矩阵,逐元素比较 R 和 Q 的大小
R.array() <= Q.array();   // 返回布尔矩阵,逐元素比较 R 是否小于等于 Q
R.cwiseInverse();         // 计算矩阵 P 的逐元素倒数
R.array().inverse();      // 也计算逐元素倒数
R.array().sin()           // 计算矩阵 P 的逐元素正弦值
R.array().cos()           // 计算矩阵 P 的逐元素余弦值
R.array().pow(s)          // 计算矩阵 P 每个元素的 s 次幂
R.array().square()        // 计算矩阵 P 的逐元素平方
R.array().cube()          // 计算矩阵 P 的逐元素立方
R.cwiseSqrt()             // 计算矩阵 P 的逐元素平方根
R.array().sqrt()          // 计算矩阵 P 的逐元素平方根
R.array().exp()           // 计算矩阵 P 的逐元素指数
R.array().log()           // 计算矩阵 P 的逐元素自然对数
R.cwiseMax(P)             // 返回矩阵 R 和 P 中逐元素的最大值
R.array().max(P.array())  // 也返回逐元素的最大值
R.cwiseMin(P)             // 返回矩阵 R 和 P 中逐元素的最小值
R.array().min(P.array())  // 也返回逐元素的最小值
R.cwiseAbs()              // 计算矩阵 P 的逐元素绝对值
R.array().abs()           // 计算矩阵 P 的逐元素绝对值
R.cwiseAbs2()             // 也计算逐元素平方绝对值
R.array().abs2()          // 也计算逐元素平方绝对值
(R.array() < s).select(P,Q);  // 对于矩阵 R 的每个元素,如果小于标量 s,则取矩阵 P 对应的元素,否则取矩阵 Q 对应的元素
R.col(j1).swap(B.col(j2));    //将R矩阵的j1列与B矩阵的j2列交换
int r, c;
// Eigen                  // 
R.minCoeff()              // 返回矩阵中的最小值
R.maxCoeff()              // 返回矩阵中的最大值
s = R.minCoeff(&r, &c)    // 返回矩阵 R 中的最小元素 s,同时 r 和 c 记录该最小元素的行和列索引
s = R.maxCoeff(&r, &c)    // 返回矩阵 R 中的最大元素 s,同时 r 和 c 记录该最大元素的行和列索引。
R.sum()                   // 返回矩阵 R 所有元素的和
R.colwise().sum()         // 返回矩阵 R 的每列元素的和
R.rowwise().sum()         // 返回矩阵 R 的每行元素的和
R.prod()                  // 返回矩阵 R 所有元素的乘积
R.colwise().prod()        // 返回矩阵 R 每列元素的乘积
R.rowwise().prod()        // 返回矩阵 R 每行元素的乘积
R.trace()                 // 返回矩阵 R 的迹(主对角线元素的和)
R.all()                   // 检查矩阵 R 的所有元素是否都为真(非零)
R.colwise().all()         // 检查矩阵 R 每列是否所有元素都为真。
R.rowwise().all()         // 检查矩阵 R 每行是否所有元素都为真。
R.any()                   // 检查矩阵 R 中是否有任意一个元素为真
R.colwise().any()         // 检查矩阵 R 每列是否有任意一个元素为真。
R.rowwise().any()         // 检查矩阵 R 每行是否有任意一个元素为真。
x.norm();                 //返回向量x的2范数
x.squaredNorm();          //返回向量x的平方范数
x.dot(y);                 //计算两个向量 x 和 y 的点积
x.cross(y);               //计算两个 3D 向量 x 和 y 的 叉积,结果是另一个与这两个向量都正交的向量。

 

求解线性方程组Ax=b

x = A.ldlt().solve(b));  // 分解适用于 对称正半定矩阵(即矩阵 A 具有非负特征值)。它分解为 A=LDLT,其中 L 是下三角矩阵,D 是对角矩阵
x = A.llt() .solve(b));  // 适用于 对称正定矩阵(即矩阵 A 的所有特征值都为正),分解为A=LLT,其中 L 是下三角矩阵。
x = A.lu()  .solve(b));  // 适用于 任意矩阵。它将矩阵 A 分解为 A=LU,其中 L 是下三角矩阵,U 是上三角矩阵。此方法 稳定且快速。
x = A.qr()  .solve(b));  // 将矩阵 A 分解为A=QR,其中 Q 是正交矩阵,R 是上三角矩阵。此方法不进行主元交换,适用于 非奇异矩阵
x = A.svd() .solve(b));  // 适用于 任意矩阵,尤其是 奇异或接近奇异的矩阵。将矩阵 A 分解为 A=UΣVT,其中 U 和 V 是正交矩阵,Σ 是对角矩阵

A.eigenvalues();                  // 计算矩阵 A 的特征值,返回一个包含所有特征值的向量
EigenSolver<Matrix3d> eig(A);     // 计算矩阵 A 的特征值和特征向量
eig.eigenvalues();                // 返回一个包含所有特征值的向量。
eig.eigenvectors();               // 返回一个矩阵,每列是对应的特征向量。

 下面给出了求上面函数的代码式列

#include <Eigen/Dense>
#include <iostream>

int main() {
    Eigen::Matrix3d A;
    A << 4, -2, 1,
         -2, 4, -2,
         1, -2, 3;

    Eigen::EigenSolver<Eigen::Matrix3d> eig(A);

    std::cout << "Eigenvalues:\n" << eig.eigenvalues() << std::endl;
    std::cout << "Eigenvectors:\n" << eig.eigenvectors() << std::endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值