Submatrices and indices using Eigen
Asked Answered
R

4

15

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.

Revisionist answered 24/11, 2012 at 9:57 Comment(3)
Is this question still valid? Or some methods for submatrix indexing have been developed meanwhile in Eigen?Certified
AFAIK, there has been no improvement in this regard. Of course, I'll be glad of being proven wrongRevisionist
Something stirs deep within the Eigen bitbucket repo, so we might be coming close to a nicer solution to this one. eigen.tuxfamily.org/bz/show_bug.cgi?id=329#c27Luckily
D
5

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.

Distaste answered 24/11, 2012 at 10:46 Comment(0)
S
10

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)
Saintpierre answered 14/9, 2013 at 21:21 Comment(1)
Is this a feature of libigl or libigl calls some Eigen method to do this?Certified
H
7

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.

Haiku answered 12/5, 2014 at 19:44 Comment(0)
D
5

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.

Distaste answered 24/11, 2012 at 10:46 Comment(0)
C
1

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

Crater answered 16/9, 2018 at 21:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.