найти 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]
.