C++ 有没有更好的方法来实现matlab';使用Eigen/C++;?

C++ 有没有更好的方法来实现matlab';使用Eigen/C++;?,c++,arrays,matlab,slice,eigen3,C++,Arrays,Matlab,Slice,Eigen3,我一直在寻找一种更“固有”的方法来实现Matlab的逻辑索引功能。这是我能想到的最好的。(为了简单起见,这里重点介绍int数组) 是否有人知道如何以更“固有”的方式,或比在数组中循环更快的方式来执行此操作?std::endl所做的不仅仅是在流中插入换行符:它也会刷新流,显著降低代码速度。如果只想插入换行符,最好使用'\n'。“一种比在数组中循环更快的方法”——我想你是说键入速度更快?任何这样的操作都必须在数组中循环,即使是单个函数调用。如果您首先计算索引元素的数量,为它们分配输出空间,然后复制这

我一直在寻找一种更“固有”的方法来实现Matlab的逻辑索引功能。这是我能想到的最好的。(为了简单起见,这里重点介绍int数组)


是否有人知道如何以更“固有”的方式,或比在数组中循环更快的方式来执行此操作?

std::endl
所做的不仅仅是在流中插入换行符:它也会刷新流,显著降低代码速度。如果只想插入换行符,最好使用
'\n'
。“一种比在数组中循环更快的方法”——我想你是说键入速度更快?任何这样的操作都必须在数组中循环,即使是单个函数调用。如果您首先计算索引元素的数量,为它们分配输出空间,然后复制这些值,可能会提高速度
push_back
确实需要重新分配,复制的n个元素为O(n log n)。您不能获取两个数组(选择数组和原始数组)的元素乘积。如果你去掉了所有的零元素(以前不是零),你会得到同样的结果。@CrisLuengo感谢endl的提示。我没有意识到这一点。我所说的更快并不是说打字更少。Eigen在封面下做了很多奇特的优化,这里我在一个集合上循环。我希望我能用上其中的一些。我只是使用selections.sum()来初始化“picked”的大小,然后用随机数运行这两个版本很多次。它实际上在没有初始化大小的情况下运行得更快,可能是因为sum()需要O(n)?谢谢你的建议。@Mansoor这基本上就是我在做的,但是没有乘法运算。Eigen中缺少的功能似乎是如何删除不需要的元素。谢谢
//an attempt at matlab-style Logical Indexing
//equivalent to the matlab:
//  original = [1,2,3,4]
//  subset = original(original < 3)

using namespace Eigen;
using std::cout;
using std::endl;

IOFormat OctaveFmt(StreamPrecision, 0, ", ", " ", "", "", "[", "]");

ArrayXi original(4);
original << 1,2,3,4;
cout<<"Original with bad values:"<<endl
    <<original.format(OctaveFmt)<<endl;

Array<bool, Dynamic,1> selections = original < 3;
cout<<"One if it's a good value:"<<endl
    <<selections.format(OctaveFmt)<<endl;

std::vector<int> picked;
for(int i = 0; i < selections.size(); i++ )
{
    if(selections(i))
    {
        picked.push_back(original(i));
    }
}

//put the vector values back into an eigen array
ArrayXi theGoodStuff = Map<ArrayXi, Unaligned>
                       (picked.data(), picked.size());

cout<<"Just the good stuff:"<<endl
    <<theGoodStuff.format(OctaveFmt)<<endl;
Original with bad values:
[1  2  3  4]
One if it's a good value:
[1  1  0  0]
Just the good stuff:
[1  2]