特征值中最大系数的索引(按列)

zmb*_*zmb 6 c++ eigen eigen3

在 Eigen 中,我可以进行行方向或列方向的“部分缩减”以获得最大系数。

例如这个程序:

#include <iostream>
#include <Eigen/Dense>

int main()
{
  Eigen::MatrixXf mat(2,4);
  mat << 1, 2, 6, 9,
         3, 1, 7, 2;

  std::cout << "Column's maximum: " << std::endl
   << mat.colwise().maxCoeff() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Column's maximum:
3 2 7 9
Run Code Online (Sandbox Code Playgroud)

我不想创建每列中具有最大系数的行向量,而是想构造一个具有每列最大系数的索引的行向量。

换句话说,我想修改程序,使输出变成:

Column's maximum:
1, 0, 1, 0
Run Code Online (Sandbox Code Playgroud)

我知道我可以一次获取一列索引,执行如下操作:

Eigen::MatrixXf::Index max_index;
mat.col(i).maxCoeff(&max_index);
Run Code Online (Sandbox Code Playgroud)

但我希望有一种更好的方法可以一步完成这一切,而不是手动循环每一列。这可能吗?(我使用的是 Eigen v3.2.7)

zmb*_*zmb 2

我在 2012 年 Eigen 用户论坛上发现了一篇帖子,表明这是不可能的,并且循环行/列确实是最好的方法。

目前还没有更短的方法。关于矢量化,vec.maxCoeff() 是矢量化(标准缩减),但不是返回索引的版本:vec.maxCoeff(int&)。这并非不可能,但我预计不会有显着的收益(如果有的话)。

我简单地浏览了一些 3.2.7 代码库,看起来自发布以来没有任何变化。