В настоящее время я работаю над проектом 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);
Благодарю.
Там в настоящее время запрос функции для выбора подматриц путем индексации в системе Eigen BugTracker. Поэтому я сомневаюсь, что так будет.
Единственный обходной путь, о котором я мог подумать, — это скопировать данные вручную. Не очень хорошо, хотя.
libigl У Eigen есть множество обёрток, чтобы он больше походил на MATLAB. В частности, есть slice
функция, так что вы можете вызвать:
igl::slice(A,indices,B);
что эквивалентно MATLAB’s
B = A(indices)
Вы можете выполнять операции с выбранными элементами только с select()
, что эквивалентно для троичного оператора?: Это не совсем то, что вы хотели, но должно работать во многих случаях.
MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));
Это заполнит B нулями, если A<3 и результат любой требуемой операции на A в противном случае.
Новейшая разработка, доступная на мастер-ветке Eigen, позволяет работать с числовыми индексами.
Вот аналогичный запрос, который показывает пример числовой индексации