Vector、VectorX、VectorXi 自身的区别

Eigen difference between Vector, VectorX, VectorXi

上下文

我正在尝试为 int 寻找最佳的一维存储类型。我打算将 Eigen::Vector 对象用作 "index containers"(即存储 int 表示更大向量索引的值),然后稍后对这些 "index containers" 进行一些自定义验证.虽然我可能会从 "index container" 中删除值,但我永远不会向其中添加新值:因此 size 将始终 <= n

但是我注意到有几个不同的 Eigen::Vector typedef,文档没有说明它们的区别。我可以从 typedef 的签名中得到一个想法,但在很大程度上我仍然不确定哪个是合适的。

  1. Eigen::Vector

  2. Eigen::VectorX

  3. Eigen::VectorXi

有人可以解释一下这些 typedef 的主要区别吗,我有一些想法,例如 VectorXi "i" 代表 int

编辑

有人要求我举例说明 "index container" 的意思:

假设我有一个布尔向量,其值为 {true, false, true, true, false}

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

这道题的重点是为索引容器找出最好的 Eigen 对象

编辑 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

没有 typdef Eigen::VectorEigen::VectorX。这种方便的 typedef 的格式是 Eigen::VectorNt,其中 Nt 的可能选择在 Eigen documentation:

中描述

Convenience typedefs

Eigen defines the following Matrix typedefs:

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>.

Where:

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 class.

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