2013-04-27 15 views
6

In MATLAB è comune suddividere i valori che soddisfano alcune condizioni da una matrice/matrice (denominata logical indexing).Eigen affinamento booleano array

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

Come si fa in Eigen? Finora ho:

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

non hanno molta esperienza con Eigen, ma sembra che si sta cercando il 'funzione select' – Amro

+0

Eventuali duplicati di [sottomatrici e indici utilizzando Eigen] (http: //stackoverflow.com/questions/13540147/submatrices-and-indices-using-eigen) –

risposta

0

Come sottolineato in risposta ad una domanda simile qui: Submatrices and indices using Eigen, libigl aggiunge questa funzionalità a Eigen.

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

equivale a

B = A(indices) 
+0

mentre potrebbe essere utile, non risponde alla domanda qui. OP ha chiesto l'equivalente di MATLAB 'A (A> 3) = 3', non come estrarre una sottomatrice ... La soluzione che ho mostrato è fondamentalmente un operatore ternario elementare equivalente a: 'm (i) = (m (i)> 3)? 3: m (i) '. – Amro

+1

L'esplorazione dei documenti, ['igl :: slice_into'] (https://github.com/libigl/libigl/blob/master/include/igl/slice_into.cpp), è una corrispondenza più stretta, ma per quanto posso Dite, funziona solo per un elenco di indici, non per un vettore di logiche ... Anche la loro tabella di conversione MATLAB-to-eigen/igl suggerisce di usare ['Eigen :: select'] (http://eigen.tuxfamily.org /dox/classEigen_1_1Select.html): http://libigl.github.io/libigl/matlab-to-eigen.html (vedi l'istruzione 'A (B == 0) = C (B == 0)'). – Amro

9

Prova 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

Questa soluzione non funziona !! – srsci

+0

@srsci: cosa intendi? L'esempio sopra funziona perfettamente, è praticamente uscito dalla documentazione. – Amro

+2

In realtà, per il problema dato (cioè il limite dei valori), solo "m.cwiseMin (3)" dovrebbe funzionare (e di solito è più veloce). – chtz

Problemi correlati