2013-04-27 10 views
6

W MATLAB jest powszechne wycięcie wartości, które spełniają pewne warunki z macierzy/tablicy (o nazwie logical indexing).Eigen boolean array slice

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

Jak zrobić to w Eigen? Do tej pory mam:

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

nie masz dużego doświadczenia z Eigen, ale wygląda na to, czego szukasz w 'funkcji select' – Amro

+0

Możliwy duplikat [podmatryc i wskaźników wykorzystujących EIGEN] (http: //stackoverflow.com/questions/13540147/submatrices-and-indices-using-eigen) –

Odpowiedz

0

Jak wskazano w odpowiedzi na podobne pytanie tutaj: Submatrices and indices using Eigen, libigl dodaje tę funkcjonalność Eigen.

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

jest równoważna

B = A(indices) 
+0

, chociaż może być przydatny, nie odpowiada na pytanie tutaj. OP poprosił o odpowiednik MATLAB-a 'A (A> 3) = 3', a nie jak wyodrębnić submatrix ... Przedstawione przeze mnie rozwiązanie jest zasadniczo operatorem potrójnym o charakterze elementarnym, równoważnym:' m (i) = (m (i)> 3)? 3: m (i) '. – Amro

+1

Przeglądanie dokumentów, ['igl :: slice_into'] (https://github.com/libigl/libigl/blob/master/include/igl/slice_into.cpp), jest bliższym dopasowaniem, ale o ile mogę tell, działa tylko dla listy indeksów, a nie dla wektorów logicznych ... Nawet ich tabela konwersji MATLAB-to-eigen/igl sugeruje użycie ['Eigen :: select'] (http://eigen.tuxfamily.org /dox/classEigen_1_1Select.html): http://libigl.github.io/libigl/matlab-to-eigen.html (patrz instrukcja "A (B == 0) = C (B == 0)"). – Amro

9

Spróbuj 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

To rozwiązanie nie działa !! – srsci

+0

@srsci: co masz na myśli? Powyższy przykład działa dobrze, praktycznie jest z dokumentacji. – Amro

+2

W rzeczywistości, dla danego problemu (tj. Ograniczania wartości) właśnie 'm.cwiseMin (3)' powinien działać (i zwykle jest szybszy). – chtz