首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++特征库中的argmax()方法

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

Stack Overflow用户
提问于 2020-06-09 18:18:34
回答 3查看 1.4K关注 0票数 2

我正在使用Eigen库进行矩阵/张量计算,其中我希望返回沿深度轴的最大值的索引。类似于numpy.argmax()在Python中所做的事情。

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

代码语言:javascript
复制
#include <Eigen/Dense>
int main(){
   Eigen::Tensor<double, 3> table(4,200,200);
   table.setRandom();
   // How can I do this task for axis = 2, i.e depth of a tensor?
   // int max_axis = table.argmax(ax=2); 
   return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-20 22:51:58

老实说,这只是一个转折,而不是问题本身的令人满意的答案。然而,下面的方法对我来说是有效的。

我在Eigen库中找不到我想要的。取而代之的是,我改用了armadillo库,它非常类似于numpy,它有一个用户友好的API。而且,相比较而言,对于有Python或Matlab背景的人来说,armadillo更容易理解。

在armadillo中,找到argmax就像下面这样简单:(在所有深度轴上查找第二行和第二列的argmax )

代码语言:javascript
复制
arma::Cube<double> A(200, 200, 4, arma::fill::randu);
uword i = A(arma::span(1),  arma::span(1), arma::span::all).index_max();
票数 1
EN

Stack Overflow用户

发布于 2020-06-22 04:09:21

特征代码库中的This test suite有一些跨轴的子集执行缩减的示例。

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

代码语言:javascript
复制
  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> >());   

reduce_dims指定应该减少的轴的列表(在本例中,仅指定通道)。返回的张量包含“线性”索引和最大值本身,因此要提取实际的通道索引,您可能需要迭代张量:

代码语言:javascript
复制
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;                
  }                 
}
票数 0
EN

Stack Overflow用户

发布于 2021-10-01 21:18:50

Eigen的张量库有一个argmin/argmax成员函数,不幸的是,目前https://eigen.tuxfamily.org/dox/unsupported/eigen_tensors.html上没有记录这个成员函数。

Eigen的矩阵库可以通过minCoeff/maxCoeff的访问者重载来模仿相同的行为。请参阅:https://eigen.tuxfamily.org/dox/group__TutorialReductionsVisitorsBroadcasting.html

代码语言:javascript
复制
#include <Eigen/Dense>
#include <unsupported/Eigen/CXX11/Tensor>
#include <iostream>

#define STR_(x)  #x
#define STR(x)  STR_(x)
#define PRINT(x)  std::cout << STR(x) << ":\n" << (x) << std::endl

int main()
{
    using namespace Eigen;
    using T = int;
    using S = Sizes<2, 3>;

    S const sizes{};

    T constexpr data[S::total_size]{
        8, 4,
        1, 6,
        9, 2,
    };

    Map<MatrixX<T> const> const matrix(data, sizes[0], sizes[1]);
    PRINT(matrix);

    RowVector2<Index> argmax{};
    matrix.maxCoeff(&argmax.x(), &argmax.y());
    PRINT(argmax);

    VectorX<Index> argmax0{matrix.cols()};
    for (Index col = 0; col < matrix.cols(); ++col)
        matrix.col(col).maxCoeff(&argmax0[col]);
    PRINT(argmax0);

    VectorX<Index> argmax1{matrix.rows()};
    for (Index row = 0; row < matrix.rows(); ++row)
        matrix.row(row).maxCoeff(&argmax1[row]);
    PRINT(argmax1);

    TensorMap<Tensor<T const, S::count>> const tensor(data, sizes);
    PRINT(tensor);
    PRINT(tensor.argmax());
    PRINT(tensor.argmax(0));
    PRINT(tensor.argmax(1));

    // Note that tensor.argmax() is the index for a 1D view of the data:
    Index const matrix_index = sizes.IndexOfColMajor(std::array{argmax.x(), argmax.y()});
    Index const tensor_index = Tensor<Index, 0>{tensor.argmax()}();
    PRINT(matrix_index == tensor_index);
}

输出:

代码语言:javascript
复制
matrix:
8 1 9
4 6 2
argmax:
0 2
argmax0:
0
1
0
argmax1:
2
1
tensor:
8 1 9
4 6 2
tensor.argmax():
4
tensor.argmax(0):
0
1
0
tensor.argmax(1):
2
1
matrix_index == tensor_index:
1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62280277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档