加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何在运行时指定boost multi_array的简并维?

发布时间:2020-12-16 07:52:14 所属栏目:百科 来源:网络整理
导读:我有一个3D multi_array,我想使用在运行时指定的维度进行2D切片.我知道退化维度的索引和我要在该退化维中提取的切片的索引.目前丑恶的解决方法看起来像这样: if (0 == degenerate_dimension){ Slice slice = input_array[boost::indices[slice_index][range
我有一个3D multi_array,我想使用在运行时指定的维度进行2D切片.我知道退化维度的索引和我要在该退化维中提取的切片的索引.目前丑恶的解决方法看起来像这样:
if (0 == degenerate_dimension)
{
    Slice slice = input_array[boost::indices[slice_index][range()][range()]];
}
else if (1 == degenerate_dimension)
{
    Slice slice = input_array[boost::indices[range()][slice_index][range()]];
}
else if (2 == degenerate_dimension)
{
    Slice slice = input_array[boost::indices[range()][range()][slice_index]];
}

有没有更美丽的方式构建index_gen对象?
这样的事情

var slicer;
for(int i = 0; i < 3; ++i) {
    if (degenerate_dimension == i)
        slicer = boost::indices[slice_index];
    else
        slicer = boost::indices[range()];
}
Slice slice = input_array[slicer];

似乎每个后续调用boost :: indices :: operator []根据维度(即先前的调用次数)返回不同的类型,所以没有办法使用可以容纳临时的index_gen对象的单个变量.

解决方法

请试试看. Сode有一个缺点 – 它指的是在boost :: detail :: multi_array命名空间中声明的ranges_数组变量.
#include <boost/multi_array.hpp>                                                                                                                              

typedef boost::multi_array<double,3> array_type;                                                                                                             
typedef boost::multi_array_types::index_gen::gen_type<2,3>::type index_gen_type;                                                                                   
typedef boost::multi_array_types::index_range range;                                                                                                          

index_gen_type                                                                                                                                                     
func(int degenerate_dimension,int slice_index)                                                                                                               
{                                                                                                                                                             
    index_gen_type slicer;                                                                                                                                         
    int i;                                                                                                                                                    
    for(int i = 0; i < 3; ++i) {                                                                                                                              
        if (degenerate_dimension == i)                                                                                                                        
            slicer.ranges_[i] = range(slice_index);                                                                                                           
        else                                                                                                                                                  
            slicer.ranges_[i] = range();                                                                                                                      
    }                                                                                                                                                         
    return slicer;                                                                                                                                            
}                                                                                                                                                             

int main(int argc,char **argv)                                                                                                                               
{                                                                                                                                                             
    array_type myarray(boost::extents[3][3][3]);                                                                                                              
    array_type::array_view<2>::type myview = myarray[ func(2,1) ];                                                                                           
    return 0;                                                                                                                                                 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读