2013-04-27 3 views
6

В MATLAB принято обрезать значения, которые удовлетворяют некоторому условию из матрицы/массива (так называемый logical indexing).Eigen boolean array slicing

vec = [1 2 3 4 5]; 
condition = vec > 3; 
vec(condition) = 3; 

Как это сделать в Eigen? До сих пор у меня есть:

Eigen::Matrix<bool, 1, 5> condition = vec.array() > 3; 
+1

не имеют большого опыта работы с Эйген, но выглядит, как вы ищете 'select' функции – Amro

+0

Возможные дубликата [подматрицы и индексов с использованием Эйген] (HTTP: //stackoverflow.com/questions/13540147/submatrices-and-indices-using-eigen) – 2016-07-13 21:13:51

ответ

0

Как указано в ответе на аналогичный вопрос здесь: Submatrices and indices using Eigen, libigl добавляет эту функциональность Эйгеном.

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

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

B = A(indices) 
+0

, хотя это может быть полезно, оно не отвечает на вопрос здесь. OP запросил эквивалент MATLAB 'A (A> 3) = 3', а не как извлечь подматрицу ... Решение, которое я показал, в основном является трехмерным операторным оператором, эквивалентным: m (i) = (m (i)> 3)? 3: m (i) '. – Amro

+1

Просмотр документов, ['igl :: slice_into'] (https://github.com/libigl/libigl/blob/master/include/igl/slice_into.cpp), является более близким, но насколько я могу tell, он работает только для списка индексов, а не для вектора логических ... Даже их таблица преобразования MATLAB-to-eigen/igl предлагает использовать ['Eigen :: select'] (http://eigen.tuxfamily.org /dox/classEigen_1_1Select.html): http://libigl.github.io/libigl/matlab-to-eigen.html (см. инструкцию 'A (B == 0) = C (B == 0)'). – Amro

9

Попробуйте this:

#include <iostream> 
#include <Eigen/Dense> 

int main() 
{ 
    Eigen::MatrixXi m(1, 5); 
    m << 1, 2, 3, 4, 5; 
    m = (m.array() > 3).select(3, m); 
    std::cout << m << std::endl; 

    return 0; 
} 
+0

Это решение не работает! – srsci

+0

@srsci: что вы имеете в виду? Приведенный выше пример работает нормально, он практически прямо из документации .. – Amro

+2

Собственно, для данной задачи (то есть, укупорки значений) просто «m.cwiseMin (3)» должен работать (и, как правило, быстрее). – chtz