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

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

概述我有一个3D multi_array,我想使用在运行指定的维度进行2D切片.我知道退化维度的索引和我要在该退化维中提取的切片的索引.目前丑恶的解决方法看起来像这样: if (0 == degenerate_dimension){ Slice slice = input_array[boost::indices[slice_index][range()][range()]];}els 我有一个3D multi_array,我想使用在运行时指定的维度进行2D切片.我知道退化维度的索引和我要在该退化维中提取的切片的索引.目前丑恶的解决方法看起来像这样:
if (0 == degenerate_dimension){    Slice slice = @R_301_5983@_array[boost::indices[slice_index][range()][range()]];}else if (1 == degenerate_dimension){    Slice slice = @R_301_5983@_array[boost::indices[range()][slice_index][range()]];}else if (2 == degenerate_dimension){    Slice slice = @R_301_5983@_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 = @R_301_5983@_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;                                                                                                                                                 }
总结

以上是内存溢出为你收集整理的c – 如何在运行时指定boost multi_array的简并维?全部内容,希望文章能够帮你解决c – 如何在运行时指定boost multi_array的简并维?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1233035.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存