Python C+中的argmax()方法+;特征库

Python C+中的argmax()方法+;特征库,python,c++,eigen,tensor,Python,C++,Eigen,Tensor,我正在使用Eigen库进行矩阵/张量计算,其中我希望返回沿深度轴的最大值的索引。与Python中的类似 张量维数如下: (行=200,列=200,深度=4) #包括 int main(){ 本征:张量表(4200200); table.setRandom(); //对于轴=2,即张量的深度,我如何完成这项任务? //int max_轴=table.argmax(ax=2); 返回0; } 老实说,这是一个迂回的问题,而不是问题本身的令人满意的答案。然而,以下方法确实对我有效 我在艾根图书馆找不到

我正在使用
Eigen
库进行矩阵/张量计算,其中我希望返回沿深度轴的最大值的索引。与Python中的类似

张量维数如下: (行=200,列=200,深度=4)

#包括
int main(){
本征:张量表(4200200);
table.setRandom();
//对于轴=2,即张量的深度,我如何完成这项任务?
//int max_轴=table.argmax(ax=2);
返回0;
}

老实说,这是一个迂回的问题,而不是问题本身的令人满意的答案。然而,以下方法确实对我有效

我在艾根图书馆找不到我想要的东西。取而代之的是,我切换到了库,它非常类似于numpy,有一个用户友好的API。而且,相对而言,对于来自Python或Matlab背景的人来说,这更容易理解

在犰狳中,找到最简单的方法如下: (在所有深度轴上查找第二行和第二列的argmax)

arma::Cube A(2002004,arma::fill::randu);
uwordi=A(arma::span(1),arma::span(1),arma::span::all).index_max();
在Eigen代码库中,有几个示例用于跨轴子集执行缩减

以下是一种似乎有效的方法:

  std::array<int, 1> reduce_dims{2};                                            
  Eigen::Tensor<Eigen::Tuple<Eigen::Index, double>, 2> reduced =                 
      table.index_tuples().reduce(reduce_dims,                                  
                                  Eigen::internal::ArgMaxTupleReducer<          
                                      Eigen::Tuple<Eigen::Index, double> >());   
arma::Cube<double> A(200, 200, 4, arma::fill::randu);
uword i = A(arma::span(1),  arma::span(1), arma::span::all).index_max();
  std::array<int, 1> reduce_dims{2};                                            
  Eigen::Tensor<Eigen::Tuple<Eigen::Index, double>, 2> reduced =                 
      table.index_tuples().reduce(reduce_dims,                                  
                                  Eigen::internal::ArgMaxTupleReducer<          
                                      Eigen::Tuple<Eigen::Index, double> >());   
for (int c = 0; c < reduced.dimension(1); ++c) {                                 
  for (int r = 0; r < reduced.dimension(0); ++r) {                            
    Eigen::Index argmax_channel_index =                                       
        reduced(r, c).first / (table.dimension(0) * table.dimension(1));      
    std::cout << "argmax channel: " << argmax_channel_index << " "            
              << "max: " << reduced(r, c).second << std::endl;                
  }                 
}