13

我想按矩阵的行查找最大值和索引。我基于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) 矩阵。谢谢!

(也发送到特征列表,抱歉交叉发布。)

4

2 回答 2

11

我的猜测是,如果不使用当前 api 的 for 循环,这是不可能的。正如您自己所说,您可以使用获取最大行值的向量

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

据我从maxCoeff()的 API 文档中可以看出,它只会写回一个索引值。以下代码(未经测试)应该给你你想要的:

MatrixXf::Index   maxIndex[2];
VectorXf maxVal(2);
for(int i=0;i<2;++i)
    maxVal(i) = mat.row(i).maxCoeff( &maxIndex[i] );
于 2012-07-18T09:25:07.817 回答
2

除了Jakob的“for loop”解决方案外,您还可以使用libigligl::mat_max功能,如 MATLAB 的 row-/column-wise 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].

于 2016-12-29T17:33:50.590 回答