You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Eigen中Matrix<Eigen::ArrayXd,3,1>的构造与访问疑问

Eigen中Matrix<Eigen::ArrayXd, 3, 1>的用法解析

1. 为什么这个类型合法?

Eigen文档里提到Scalar参数通常是标量类型(如int、double),但这只是常规用法,并非强制限制。Eigen的Matrix模板实际上允许Scalar是任何满足可拷贝、可赋值的类型——只要你不对这个Matrix做需要Scalar支持算术运算的操作(比如矩阵乘法),仅用来存储和访问元素的话完全合法。这里的Matrix<Eigen::ArrayXd, 3, 1>本质是一个3行1列的“容器矩阵”,每个元素是一个独立的ArrayXd对象。

2. 如何构造这个类型?

你看到的z = {a,b,c}是C++11及以后的列表初始化语法,Eigen对这种初始化方式提供了原生支持:直接把三个ArrayXd对象按顺序填入矩阵的元素位置,对应3行1列的结构,z的第一行元素就是a,第二行是b,第三行是c。

也可以显式逐个赋值构造:

Eigen::Matrix<Eigen::ArrayXd, 3, 1> z;
z(0) = a;
z(1) = b;
z(2) = c;

3. 如何访问a的成员?

要访问a的第1个元素(注意Eigen的Array下标从0开始),需要先拿到z中存储的a对象,再用Array的下标语法访问:

// 先通过()获取z的第一个元素(对应a),再用[]访问a的第1个元素
double val = z(0)[1];

这里用z(0)是因为Matrix默认用(行索引, 列索引)访问元素,而z是3x1的矩阵,列索引可以省略,直接写z(0)即可定位到a。

和numpy.vstack的区别

numpy的vstack是把多个数组堆叠成一个更大的一维/二维数组,比如把三个长度为n的数组vstack后,会得到一个3n长度的一维数组或3行n列的二维数组。但Eigen的Matrix<Eigen::ArrayXd, 3, 1>是把三个ArrayXd作为独立元素存储,相当于一个“数组的容器”,每个元素本身还是完整的ArrayXd,和vstack的结果完全不同。如果要实现类似numpy.vstack的效果,应该用Eigen::ArrayXd的拼接:

Eigen::ArrayXd z = Eigen::ArrayXd::Zero(a.size() + b.size() + c.size());
z << a, b, c;

内容的提问来源于stack exchange,提问作者user900476

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:00:01