2012-07-11 14 views
6

Quiero encontrar los valores máximos y los índices por fila de una matriz. Basé esto en un ejemplo en el eigen website (ejemplo 7).encuentra rowwise maxCoeff e índice de maxCoeff en 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 aquí es que mi línea

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

está mal. El ejemplo original tiene

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

es decir, hay una reducción adicional .sum() involucrado. ¿alguna sugerencia? Creo que sólo quiero que el eigen equivalente a lo que en Matlab que iba a escribir como

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

es decir, encontrar el máximo valor y del índice sobre la segunda dimensión de myMatrix y regresar en un (nrow (myMatrix), 2) la matriz. gracias!

(enviado a la lista Eigen, así, lo siento por la publicación cruzada.)

Respuesta

9

Mi conjetura es que esto no es posible sin necesidad de utilizar un bucle mediante la API actual. Como usted mismo ha dicho, se puede obtener el vector de valores máximos fila usando

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

Por lo que yo puedo decir de la documentación de la API para maxCoeff() que sólo escribir de nuevo un único valor del índice. siguiente código (no probado) debe darle lo que quiere:

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í, eso es lo que implementé mientras tanto. ¡gracias por tu respuesta! Recurrí al foro de eigen kde, ya que parece que no hay muchos usuarios de SOF. –

1

Además del "bucle" solution by Jakob, también se puede utilizar libigl 's igl::mat_max que funciona como de fila/max por columnas de MATLAB

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); 

Entonces maxVals contendría [9;7] y maxIndices contendría [3;2].

Cuestiones relacionadas