I'm currently working on a MATLAB project and I'd like to re-implement the most computational-heavy parts using C++ and Eigen.
I'd like to know if there's a way to perform the following operation (MATLAB syntax):
B = A(A < 3);
For those who are not familiar with MATLAB, the above-mentioned command initializes a matrix B made of the cells in A whose values are less than 3.
I've seen from a post on the Eigen forum that it's possible to obtain the indices of interest by using:
MatrixXi indices = (A.array() < 3).cast<int>();
What I'd like to have is something like:
MatrixXd B = A(A.array() < 3);
Thanks.
There currently is a feature request for selecting sub-matrices by indexing filed at the Eigen BugTracker system. Therefore, I doubt it will be possible that way.
The only workaround I could think of is to copy the data manually. Not very nice though.
libigl has many wrappers for Eigen to make it feel more like MATLAB. In particular, there is a slice
function so that you can call:
igl::slice(A,indices,B);
which is equivalent to MATLAB's
B = A(indices)
You can perform operations on selected elements only with select()
, which is the equivalent for the ternary ?: operator. This is not exactly what you wanted, but should work in many cases.
MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));
This will fill B with zeros if A<3 and the result of any required operation on A otherwise.
The latest development available on master branch of Eigen allows to work with numerical indices.
Here is a similar request, that shows an example of numerical indexing