MATLAB find() / Numpy nonzero idioms for Eigen
c++, eigen, matlab
Solution
It is reasonable to expect Eigen to have a find() function. Unfortunately, Eigen doesn't have one, or even a less than operator for matrices. Fortunately, the problem isn't too difficult. Here is one solution to the problem. I am using vector to store the Column Major indices of elements > 0. You could use VectorXf if you prefer that. Use this on B - A (B-A > 0 is the same as evaluating B>A). I'm using the stl for_each() function.
#include<algorithm>
#include<vector>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
class isGreater{
public:
vector<int>* GT;
isGreater(vector<int> *g){GT = g;}
void operator()(float i){static int it = 0; if(i>0)GT->push_back(it); it++;}
};
int main(int argc,char **argv){
MatrixXf P = MatrixXf::Random(4,5);
vector<int> GT;
for_each(P.data(),P.data()+P.rows()*P.cols(),isGreater(>));
cout<<P<<endl;
for(int i=0;i<GT.size();++i)cout<<GT[i]<<" ";
cout<<GT.size()<<endl;
return 0;
}
Problem
Chances are this is a very stupid question but I spent a pretty absurd amount of time looking for it on the documentation, to no avail. in MATLAB, the find() function gives me an array with the indices of nonzero elements. Numpy's np.nonzero function does something similar. How do I do this in the C++ Eigen library? I have a Boolean array of ``` typedef <bool, 10, 1> foobar = MatrixA < MatrixB; ``` so far. Thanks!