C++ 使用特征值查找两个列表之间的差异

C++ 使用特征值查找两个列表之间的差异,c++,eigen,eigen3,C++,Eigen,Eigen3,我想找出两个列表之间的区别。例如: // two lists: A = [ 0, 1, 2, 3, 4, 5, 6 ]; B = [ 1, 4, 5 ]; // difference between the lists: C = [ 0, 2, 3, 6 ]; 我使用C++的STL库做如下: #include <iostream> #include <vector> int main() { std::vector<size_t> A = {0, 1

我想找出两个列表之间的区别。例如:

// two lists:
A = [ 0, 1, 2, 3, 4, 5, 6 ];
B = [ 1, 4, 5 ];

// difference between the lists:
C = [ 0, 2, 3, 6 ];

我使用C++的STL库做如下:

#include <iostream>
#include <vector>

int main()
{
  std::vector<size_t> A = {0, 1, 2, 3, 4, 5, 6};
  std::vector<size_t> B = {1, 4, 5};
  std::vector<size_t> C;

  std::set_difference(A.begin(),A.end(), B.begin(),B.end(), std::inserter(C,C.begin()));

  return 0;
}
#包括
#包括
int main()
{
向量A={0,1,2,3,4,5,6};
向量B={1,4,5};
std::向量C;
设置差异(A.begin(),A.end(),B.begin(),B.end(),std::inserter(C,C.begin());
返回0;
}
然而,由于我的应用程序主要使用Eigen,所以我现在也希望使用Eigen来实现这一点。我在文档或在线上都找不到我想要的东西

请注意,我特别希望避免编写自己的函数。

给你:

#include <iostream>
#include <Eigen/Dense>

int main()
{
    using namespace Eigen;

    VectorXd a(3), b(1);
    VectorXd c(a.size());

    a << 1,2,3;
    b << 1;

    auto it = std::set_difference(a.data(), a.data() + a.size(), 
                                  b.data(), b.data() + b.size(), 
                                  c.data());
    c.conservativeResize(std::distance(c.data(), it)); // resize the result
    std::cout << c;
}
#包括
#包括
int main()
{
使用名称空间特征;
向量xdA(3),b(1);
向量xd c(a.size());
a给你:

#include <iostream>
#include <Eigen/Dense>

int main()
{
    using namespace Eigen;

    VectorXd a(3), b(1);
    VectorXd c(a.size());

    a << 1,2,3;
    b << 1;

    auto it = std::set_difference(a.data(), a.data() + a.size(), 
                                  b.data(), b.data() + b.size(), 
                                  c.data());
    c.conservativeResize(std::distance(c.data(), it)); // resize the result
    std::cout << c;
}
#包括
#包括
int main()
{
使用名称空间特征;
向量xdA(3),b(1);
向量xd c(a.size());


a你怎么会认为Eigen有什么用呢?使用你面前的东西并工作有什么错?如果可以用标准库来实现,那么Eigen为什么还要费心用自己的方式实现呢?“注意,我特别想避免编写自己的函数。”…根本不清楚要避免什么,您已经有了解决方案,无需编写own@JohnZwinck这更像是一种希望……我希望(ed)通过尽可能少的切换次数(甚至从不切换)来提供最佳的最终用户体验在特征向量和STL向量之间。当然,建议的STL解决方案绝对没有错!(我一点也不支持特征向量,但我想让非专业人士可以访问此代码,我觉得坚持一件事可能会有所帮助)@TomdeGeus:STL算法可以应用于非STL数据结构,包括Eigen。算法工作于迭代器而不是容器,我不太了解Eigen,但如果他们的容器不提供迭代器,我会感到惊讶。什么让你认为Eigen有什么用呢?使用已经在你面前的东西并工作有什么错吗?如果是的话可以用标准库实现,那么为什么Eigen会费心用自己的方式实现呢?“请注意,我特别想避免编写自己的函数。”…根本不清楚要避免什么,您已经有了解决方案,无需编写自己的函数own@JohnZwinck这更像是一种希望……我想要(埃德)这是为了通过在特征向量和STL向量之间切换尽可能少的次数(甚至永远不会)来提供最佳的最终用户体验。当然,建议的STL解决方案绝对没有错!(我一点也不支持特征向量,但我想让非专业人士可以访问此代码,我觉得坚持一件事可能会有所帮助)@TomdeGeus:STL算法可以应用于非STL数据结构,包括Eigen。算法工作于迭代器而不是容器,我不太了解Eigen,但是如果他们的容器不提供迭代器,我会感到惊讶。这非常有帮助!只是为了澄清一下,在
Eigen::MatrixXd
的情况下,原则上也有相同的技巧可以正确使用吗?但这可能会增加行和列的数量,我该如何解决?(我意识到
set_difference
可能不是矩阵最相关的应用程序)@TomdeGeus
MatrixXd::data()
将返回指向第一个元素的指针。Eigen使用列主顺序,因此当递增指针时,矩阵将按列主顺序遍历,即如果
为Clear。但是我可以更改条目数吗?根据您的答案,我猜答案是肯定的。但是,我如何决定如何更改行数和列数umns(并将其存储到矩阵变量)@TomdeGeus你是什么意思?你是在谈论重塑矩阵吗?你可能应该检查
std::set_difference
的返回值,然后调整
c
(使用
保守调整大小
)。此外,
c
应该初始化为
a
的大小,以防没有公共元素。太棒了,这很有帮助!只是为了澄清一下,在
Eigen::MatrixXd
的情况下,原则上也可以使用相同的技巧,对吗?但这可能会导致行数和列数增加,我如何解决这个问题?(我意识到
set_difference
可能不是矩阵最相关的应用)@TomdeGeus
MatrixXd::data()
将返回指向第一个元素的指针。Eigen使用列主顺序,因此当递增指针时,矩阵将按列主顺序遍历,即如果
为Clear。但是我可以更改条目数吗?根据您的答案,我猜答案是肯定的。但是,我如何决定如何更改行数和列数umns(并将其存储到矩阵变量)@TomdeGeus你是什么意思?你是在谈论重塑矩阵吗?你可能应该检查
std::set_difference
的返回值,然后调整
c
(使用
保守调整大小
)。此外,
c
应初始化为
a
,以防没有公共元素。