найти rowwise maxCoeff и индекс maxCoeff в Eigen

Я хочу найти максимальные значения и индексы по строке матрицы. Я основал это на примере сайт Эйген (пример 7).

#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;
}

проблема здесь в том, что моя строка

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

- это неправильно. Исходный пример имеет

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

т. е. есть дополнительное сокращение .sum () участвует. есть предложения? Думаю, я просто хочу, чтобы собственный эквивалент того, что в matlab я бы написал как

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

т. е. найти максимум значение и его индекс над вторым измерением mymatrix и возврат в матрицу(nrow (mymatrix),2). спасибо!

(отправлено в собственный список, извините за перекрестную публикацию.)

2 ответов


Я предполагаю, что это невозможно без использования цикла for с использованием текущего api. Как вы сами сказали, Вы можете получить вектор максимальных значений строк, используя

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

насколько я могу судить из документации API для maxCoeff() он будет записывать только одно значение индекса. Следующий код (непроверенный) должен дать вам то, что вы хотите:

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

кроме "для петли" решение Якоб, вы также можете использовать libigl ' s igl::mat_max какие функции, такие как строка/столбец MATLAB 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);

затем maxVals содержит [9;7] и maxIndices содержит [3;2].