问题描述
我有一个3D multi_array,我想使用在运行时指定的维度制作2D切片。我知道退化维度的索引和我想在退化维度中提取的切片的索引。目前丑陋的解决方法如下:
I have a 3D multi_array and I would like to make 2D slices using dimensions specified at runtime. I know the index of degenerate dimension and the index of a slice that I want to extract in that degenerate dimension. Currently the ugly workaround looks like that:
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对象?
这样的东西:
Is there a more beautiful way to construct index_gen object?Something like that:
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对象。
It seems each subsequent call to boost::indices::operator[] returns a different type depending on the dimensionality (i.e. number of previous calls), so there's no way to use a single variable, that can hold the temporary index_gen object.
推荐答案
请试试这个。 Сode有一个缺点 - 它指的是在boost :: detail :: multi_array命名空间中声明的ranges_数组变量。
Please, try this. Сode has one disadvantage - it refers to ranges_ array variable declared at boost::detail:: multi_array namespace.
#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;
}
这篇关于如何指定boost multi_array在运行时退化维度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!