如何检查向量的所有元素是不是在 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<Index, Dynamic, 1>
而不是简单地使用std::vector<Eigen::Index>
并没有太多好处(尽管您可能有除此问题之外的原因在此处使用Eigen::Matrix
)。
【讨论】:
以上是关于如何检查向量的所有元素是不是在 Eigen c++ 中的另一个向量中?的主要内容,如果未能解决你的问题,请参考以下文章