2012-07-11 12 views
6

Voglio trovare i valori massimi e gli indici per riga di una matrice. Ho basato questo su un esempio su eigen website (esempio 7).trovare rowwise maxCoeff e Index of maxCoeff in Eigen

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

using namespace std; 
using namespace Eigen; 
int main() 
{ 
    MatrixXf mat(2,4); 
    mat << 1, 2, 6, 9, 
      3, 1, 7, 2; 

    MatrixXf::Index maxIndex; 

    VectorXf maxVal = mat.rowwise().maxCoeff(&maxIndex); 

    std::cout << "Maxima at positions " << endl; 
    std::cout << maxIndex << std::endl; 
    std::cout << "maxVal " << maxVal << endl; 
} 

problema qui è che la mia linea

VectorXf maxVal = mat.rowwise().maxCoeff(&maxIndex); 

è sbagliato. L'esempio originale ha

float maxNorm = mat.rowwise().sum().maxCoeff(&maxIndex); 

cioè c'è una riduzione aggiuntiva .sum(). eventuali suggerimenti? Credo che voglio solo l'Eigen equivalente a quello che in MATLAB avrei scritto come

[maxval maxind] = max(mymatrix,[],2) 

cioè trovare il valore massimo e dell'indice sopra la seconda dimensione di myMatrix e ritornare in un (nrow (myMatrix), 2) a matrice. grazie!

(inviata alla lista Eigen così, mi spiace per il cross-posting.)

risposta

9

La mia ipotesi è che questo non è possibile senza l'utilizzo di un ciclo utilizzando l'API corrente. Come hai detto tu stesso, è possibile ottenere il vettore di valori massimi di fila utilizzando

VectorXf maxVal = mat.rowwise().maxCoeff(); 

Per quanto posso dire dalla documentazione API per maxCoeff() sarà solo scrivere di nuovo un singolo valore di indice. A seguito di codice (non testato) dovrebbe darvi ciò che si vuole:

MatrixXf::Index maxIndex[2]; 
VectorXf maxVal(2); 
for(int i=0;i<2;++i) 
    maxVal(i) = mat.row(i).maxCoeff(&maxIndex[i]); 
+0

hi jakob. sì, questo è ciò che ho implementato nel frattempo. grazie per la tua risposta! Ho fatto ricorso al forum egen kde, poiché non sembrano esserci molti utenti eigen su SOF. –

1

Oltre al "ciclo for" solution by Jakob, si potrebbe anche usare libigl s' igl::mat_max che funziona come di MATLAB row-/colonna-saggio max

Eigen::MatrixXf mat(2,4); 
mat << 1, 2, 6, 9, 
     3, 1, 7, 2; 
Eigen::VectorXi maxIndices; 
Eigen::VectorXf maxVals; 
igl::mat_max(mat,2,maxVals,maxIndices); 

Quindi maxVals conterrà [9;7] e maxIndices conterrà [3;2].