Подматрицы и индексы, использующие Eigen

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

B = A(A < 3);

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

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

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

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

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

Благодарю.

14

Решение

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

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

5

Другие решения

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

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

что эквивалентно MATLAB’s

B = A(indices)
10

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

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

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

4

Новейшая разработка, доступная на мастер-ветке Eigen, позволяет работать с числовыми индексами.

Вот аналогичный запрос, который показывает пример числовой индексации

0
По вопросам рекламы [email protected]