Подматрицы и индексы с использованием Eigen

В настоящее время я работаю над проектом MATLAB, и я бы хотел повторно реализовать большинство вычислительно-тяжелых частей с использованием С++ и Eigen. Я хотел бы знать, есть ли способ выполнить следующую операцию (синтаксис MATLAB):

B = A(A < 3);

Для тех, кто не знаком с MATLAB, вышеупомянутая команда инициализирует матрицу B, состоящую из ячеек в A, значения которых меньше 3.

Я видел из сообщения на Eigen forum, что можно получить интересующие индексы, используя:

MatrixXi indices = (A.array() < 3).cast<int>();

То, что я хотел бы иметь, это что-то вроде:

MatrixXd B = A(A.array() < 3);

Спасибо.

Ответы

Ответ 1

В настоящее время существует запрос функции для выбора подматриц путем индексации, поданной в системе Eigen BugTracker. Поэтому я сомневаюсь, что это будет возможно.

Единственным обходным решением, о котором я мог думать, является копирование данных вручную. Не очень приятно, хотя.

Ответ 2

libigl имеет множество оберток для Eigen, чтобы он больше напоминал MATLAB. В частности, существует функция slice, чтобы вы могли вызвать:

igl::slice(A,indices,B);

что эквивалентно

MATLAB <
B = A(indices)

Ответ 3

Вы можете выполнять операции с выбранными элементами только с select(), что эквивалентно для тройного оператора::. Это не совсем то, что вы хотели, но должно работать во многих случаях.

MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));

Это заполнит B нулями, если A < 3 и результат любой требуемой операции на A в противном случае.