在Eigen中找到rowwise maxCoeff和maxCoeff的索引

时间:2012-07-11 10:24:11

标签: eigen

我想找到矩阵行的最大值和索引。我的基础是eigen website 上的一个例子(例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 个答案:

答案 0 :(得分:9)

我的猜测是,如果不使用当前的api使用for循环,这是不可能的。正如您自己所说,您可以使用

获取最大行值的向量
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] );

答案 1 :(得分:2)

除了“for循环”solution by Jakob之外,您还可以使用libiglcount,其函数类似于MATLAB的行/列最大值

igl::mat_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