Подматрицы и индексы с использованием 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 в противном случае.