2012-07-11 6 views
6

Chcę znaleźć maksymalne wartości i indeksy według wiersza macierzy. Oparłem to na przykładzie na eigen website (przykład 7).find rowwise maxCoeff and 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; 
} 

Problem jest to, że moja linia

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

jest źle. Oryginalny przykład ma

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

, tj. Zawiera dodatkową redukcję .sum(). jakieś sugestie? Chyba po prostu chcesz eigen równowartość co w Matlab chciałbym napisać jak

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

tj znaleźć maksymalną wartość i jest to wskaźnik nad drugim wymiarem o nazwie myMatrix i wrócić w (nrow (o nazwie myMatrix), 2) matryca. dzięki!

(wysłane do listy EIGEN jak dobrze, przepraszam za cross-posting.)

Odpowiedz

9

Domyślam się, że nie jest to możliwe bez użycia pętli for użyciu bieżącego API. Jak sam pan powiedział, można uzyskać wektor maksymalnych wartościach rzędu przez

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

O ile mogę powiedzieć z dokumentacji API dla maxCoeff() będzie tylko zapis z powrotem pojedynczą wartość indeksu. Poniższy kod (niesprawdzone) powinny dać ci to, co chcesz:

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

Cześć jakob. tak, to jest to, co zaimplementowałem w międzyczasie. dzięki za odpowiedź! Opierałem się na forum eigen kde, ponieważ nie ma wielu użytkowników własnych na SOF. –

1

Oprócz „do pętli” solution by Jakob, można również użyć libigl „s igl::mat_max który działa jak row-/kolumny mądry max Matlaba

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

Następnie maxVals będzie zawierać [9;7] i maxIndices będzie zawierać [3;2].