Eigen Matrix 详解

Eigen Matrix 详解

在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,Vectors 只是一种特殊的矩阵,行或者列为1.

Matrix的前三个模板参数

Matrix 类有6个模板参数,现在我们了解前三个足够。剩下的三个参数都有默认值,后面会探讨,现在不管他。
Matrix 的三个强制的模板参数:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
  • Scalar 就是矩阵元素标量类型。
  • RowsAtCompileTime 和ColsAtCompileTime 分别指代编译时候的行和列值。
    Eigen中提供了许多typedefs ,例如Matrix4f 是4*4的float型矩阵:
typedef Matrix<float, 4, 4> Matrix4f;

Vectors

正如前面提到的那样,在Eigen中,vectors 只是一种特殊形式的矩阵,有一行或者一列。在大多数情况下一列比较多,这样的向量也叫做列向量,也简称向量。其他情况叫做行向量。

例如typedef Vector3f 是一个(列)向量,它的定义如下:

typedef Matrix<float, 3, 1> Vector3f;

同样我们也提供了行向量的定义:

typedef Matrix<int, 1, 2> RowVector2i;

特殊值Dynamic

当然,Eigen 不局限于在编译时候确定大小的矩阵。模板参数RowsAtCompileTime 和ColsAtCompileTime 可以传入特殊的值Dynamic ,来标志在编译时大小无法确定,需要当做运行时变量来处理。在中的术语叫做动态大小,与之相应的在编译时确定大小的叫做固定大小。
例如typedef MatrixXd,指的是元素为double,大小为动态的:

typedef Matrix<double, Dynamic, Dynamic> MatrixXd;

类似 typedef VectorXi如下:

typedef Matrix<int, Dynamic, 1> VectorXi;

当然你可以定义一个固定行的,列是动态的float矩阵如下:

Matrix<float, 3, Dynamic>

构造器

总是会有默认的构造器,不会进行动态内存分配,也不会初始化矩阵元素。

Matrix3f a;
MatrixXf b;

这里,a是一个3*3的元素,其中还有一个float[9]数组,其中的元素没有初始化;b是一个动态大小的矩阵,目前的大小是0*0,它的元素数组完全没有分配。
构造器中全入大小的构造器也是有的,行是先传入的。对于向量,直接传入向量大小。他们会分配元素数组,但是不会初始化元素。

MatrixXf a(10,15);
VectorXf b(30);

这里,a是10x15动态矩阵,数组内存已经分配,但是没有初始化;b是一个大小为30的向量,数组内存已经分配,但是元素没有初始化。
为了提供统一的API ,在固定类型的矩阵上指定大小也是合法的,例如:

Matrix3f a(3,3);

最后,我们提供了一些便捷方式为小的大小的向量元素提供初始化方法:

Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);

逗号初始化

void fun3()
{
Eigen::Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
  std::cout << m;
}

Matrix 和 vector元素可以通过逗号分隔初始化方法初始化

Resizing

rows(), cols() 和 size(). 分别返回矩阵的行数、列数和元素的个数.动态矩阵大小可以通过 resize()改变大小

void fun4()
{
    Eigen::MatrixXd m(2,5);
    cout<<"m "<<"rows="<<m.rows()<<"cols="<<m.cols()<<"coefficeints="<<m.size()<<endl;
    m.resize(4,5);
    cout<<"m "<<"rows="<<m.rows()<<"cols="<<m.cols()<<"coefficeints="<<m.size()<<endl;
    Eigen::VectorXd v(2);
    v.resize(5);
    cout<<"v "<<"rows="<<v.rows()<<"cols="<<v.cols()<<"coefficeints="<<v.size()<<endl;
}

resize() 如果大小没有变化将不会进行任何操作,否则则是破坏性的。如果你想使用resize() 同时不想改变元素的值,请使用conservativeResize()。
为了达到API 的一致性,所有固定大小的矩阵都有上面的方法,试着改变固定大小的矩阵会触发断言错误。以下代码是合法的:

 Matrix4d m;
  m.resize(4,4); // no operation
  std::cout << "The matrix m is of size "
            << m.rows() << "x" << m.cols() << std::endl;

Assignment 和resizing

赋值是将一个矩阵拷贝进另外一个矩阵,使用操作符=。Eigen 会自动跳转左面元素的大小,从而使得它和右侧元素匹配。例如:

MatrixXf a(2,2);
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;
MatrixXf b(3,3);
a = b;
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;

a原先大小 2x2
a现在大小 3x3
当然,如果左侧是固定大小的矩阵,那么改变大小是不允许的。
如果你不需要这种自动调整大小,你可以将他关闭。

可选模板参数

我下面看看剩下的三个可选参数:

Matrix<typename Scalar,
       int RowsAtCompileTime,
       int ColsAtCompileTime,
       int Options = 0,
       int MaxRowsAtCompileTime = RowsAtCompileTime,
       int MaxColsAtCompileTime = ColsAtCompileTime>
  • Options 是一个位字段。我们只讨论一个RowMajor,是按行存储,默认是按列存储的。Matrix
  • 29
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Eigen矩阵的Options参数是Matrix类的第四个模板参数,用于指定矩阵的存储选项和特性。Options参数是一个位掩码,可以通过按位或运算符来组合多个选项。常见的Options选项包括: - Eigen::AutoAlign:自动对齐。默认情况下,Eigen会尽可能地对齐矩阵以提高性能。这个选项可以指示Eigen自动选择对齐方式。 - Eigen::RowMajor:行主序存储。默认情况下,Eigen将矩阵以列主序存储,即逐列存储元素。使用RowMajor选项可以将矩阵以行主序存储,即逐行存储元素。 - Eigen::ColMajor:列主序存储。这是Eigen的默认选项,矩阵以列主序存储。 - Eigen::StorageOptions:存储选项。可以通过按位或运算符来组合AutoAlign、RowMajor和ColMajor选项。 - Eigen::DontAlign:不对齐。这个选项可以指示Eigen不对齐矩阵,这可能会降低性能。 - 其他选项:还有一些其它的选项,如Eigen::LowerTriangular、Eigen::UpperTriangular等,用于指定矩阵的特性和存储方式。 总结起来,Eigen矩阵的Options参数用于指定矩阵的存储选项和特性,可以通过按位或运算符来组合多个选项。常见的选项包括AutoAlign、RowMajor、ColMajor和DontAlign等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Eigen 矩阵Matrix及其简单操作](https://blog.csdn.net/qq_43904309/article/details/126261549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Eigen::Matrix的6个模板参数含义](https://blog.csdn.net/weixin_41232202/article/details/129674120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Eigen Matrix 详解](https://blog.csdn.net/qq_29931083/article/details/107517245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值