首页 > 解决方案 > Vector,VectorX,VectorXi之间的特征差异

问题描述

语境

我正在尝试为int. 我打算将 Eigen::Vector 对象用作“索引容器”(即存储int表示较大向量索引的值),然后稍后对这些“索引容器”进行一些自定义验证。虽然我可能会从这个“索引容器”中删除值,但我永远不会向它添加新值:所以size总是 <=n

但是我注意到有几个不同Eigen::Vector的 typedefs 文档没有指定差异。我可以从 typedef 的签名中得到一个想法,但很大程度上仍然不确定哪个是合适的。

  1. Eigen::Vector

  2. Eigen::VectorX

  3. Eigen::VectorXi

有人可以解释一下这些 typedef 的主要区别吗,我有一些想法,比如VectorXi“i”代表什么意思int

编辑

已经请求了我所说的“索引容器”的示例:

想象一下,我有一个布尔向量,其值为 {true, false, true, true, false}

由此,我的索引容器将具有值 {0, 2, 3}

这个问题的重点是找出索引容器的最佳特征对象

编辑 2

不相关,但为什么是索引容器?我需要执行多个直接基于索引值的不同验证规则。

例如验证 1:如果 cont2 中的任何值小于 cont1[0],则删除它们

cont1 cont2
--    --
0,    2,
5,    3,
10,   8,
13    12,

for (i = 0; i <= cont2.size(); i++)
    if cont2[i] <= cont1[0]:
       cont2.remove(i)
    else:
       break

标签: arraysvectorindexingeigen

解决方案


没有 typdefEigen::VectorEigen::VectorX. 这种方便的 typedef 的格式是Eigen::VectorNt,其中可能的选择NtEigen 文档中进行了描述:

方便的 typedef

Eigen 定义了以下 Matrix 类型定义:

MatrixNt for Matrix<type, N, N>. For example, MatrixXi for Matrix<int, Dynamic, Dynamic>.
VectorNt for Matrix<type, N, 1>. For example, Vector2f for Matrix<float, 2, 1>.
RowVectorNt for Matrix<type, 1, N>. For example, RowVector3d for Matrix<double, 1, 3>.

在哪里:

N can be any one of 2, 3, 4, or X (meaning Dynamic).
t can be any one of i (meaning int), f (meaning float), d (meaning double), cf (meaning complex<float>), or cd (meaning complex<double>).

这些都是密集Eigen::Matrix类的变体。

对于将引用较大向量的元素的“索引容器”,您的意思并不完全清楚。索引号可以存储在Eigen::VectorXi容器中,但可能有更好的选择。如果只需要“索引容器”中列出的那些元素,并且大向量的所有其他元素都为零,那么 anEigen::SparseVector将很有用。如果你提供一个具体的例子,它会更容易提供帮助。


推荐阅读