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 的签名中得到一个想法,但在很大程度上我仍然不确定哪个是合适的。
Eigen::Vector
Eigen::VectorX
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::Vector
或 Eigen::VectorX
。这种方便的 typedef 的格式是 Eigen::VectorNt
,其中 N
和 t
的可能选择在 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
将很有用。如果您提供一个具体的例子,将会更容易提供帮助。
上下文
我正在尝试为 int
寻找最佳的一维存储类型。我打算将 Eigen::Vector 对象用作 "index containers"(即存储 int
表示更大向量索引的值),然后稍后对这些 "index containers" 进行一些自定义验证.虽然我可能会从 "index container" 中删除值,但我永远不会向其中添加新值:因此 size
将始终 <= n
但是我注意到有几个不同的 Eigen::Vector
typedef,文档没有说明它们的区别。我可以从 typedef 的签名中得到一个想法,但在很大程度上我仍然不确定哪个是合适的。
Eigen::Vector
Eigen::VectorX
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::Vector
或 Eigen::VectorX
。这种方便的 typedef 的格式是 Eigen::VectorNt
,其中 N
和 t
的可能选择在 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
将很有用。如果您提供一个具体的例子,将会更容易提供帮助。