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;
}
}