如何检查向量的所有元素是不是在 Eigen c++ 中的另一个向量中?

Posted

技术标签:

【中文标题】如何检查向量的所有元素是不是在 Eigen c++ 中的另一个向量中?【英文标题】:How can I check if all the elements of a vector are within another vector in Eigen c++?如何检查向量的所有元素是否在 Eigen c++ 中的另一个向量中? 【发布时间】:2020-02-24 14:52:31 【问题描述】:

如何检查向量的所有元素是否在 Eigen c++ 中的另一个向量中?或者换句话说,如何检查一个向量是否包含在另一个向量中,或者是 Eigen C++ 中另一个向量的子集?

如果

Eigen::Matrix<Index, Eigen::Dynamic, 1>  activeset <<0,1,2,3,4,5; 

Eigen::Matrix<Index, Eigen::Dynamic, 1>  detectedset <<0,1,2,3,4,5,6; 

然后activeset被包含在检测集中

如果

Eigen::Matrix<Index, Eigen::Dynamic, 1>  activeset <<0,1,2,3,4,5; 

Eigen::Matrix<Index, Eigen::Dynamic, 1>  detectedset <<0,1,2,3,5,6,7; 

那么activeset不包含在detectedset中,因为detectedset缺少activeset中的4。

eigen c++ 中是否有一个函数可以做到这一点?或者我们该怎么做?

【问题讨论】:

向量是否包含唯一条目并且是否已排序?你的例子就是这种情况 Eigen 是一个线性代数库,除了基本的矩阵和向量类型外,还专注于对这些类型的运算以及数值求解器。但是,它不涵盖集合论或提供集合类型,因此如果您希望能够将矩阵视为(可能退化的)数字的集合集合的表示,则必须编写自己的 isSubset() 函数你想应用一般集合论。 @idclev463035818 它们是独一无二的,是的,但不一定是排序的,但是我想如果需要的话我可以对它们进行排序。 【参考方案1】:

使用 Eigen 的开发分支(以及即将推出的 3.4 版本),您可以使用与 std 算法兼容的迭代器访问 Eigen 对象,例如,您可以简单地编写:

std::includes(detectedset.begin(), detectedset.end(), activeset.begin(), activeset.end())

完整的工作演示:https://godbolt.org/z/kguGjW。

请注意,std::include 需要对两个范围进行排序(如果需要,您可以使用 std::sort 进行排序)。另请注意,为此目的,使用Eigen::Matrix&lt;Index, Dynamic, 1&gt; 而不是简单地使用std::vector&lt;Eigen::Index&gt; 并没有太多好处(尽管您可能有除此问题之外的原因在此处使用Eigen::Matrix)。

【讨论】:

以上是关于如何检查向量的所有元素是不是在 Eigen c++ 中的另一个向量中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eigen (C++) 中处理复数?

Eigen向量和矩阵的用法1(C++)

eigen c++ 有neon优化吗

线性代数c++模板库 eigen如何使用

C ++:检查向量中的元素是不是大于另一个具有相同索引的元素的有效方法?

如何创建 Eigen::Ref 的向量