【问题标题】:Complexity of boost::multi_array reshape() functionboost::multi_array reshape() 函数的复杂性
【发布时间】:2014-11-12 06:09:29
【问题描述】:

boost::multi_arrayreshape() 函数的复杂度是多少?我希望它是 O(1) 但我在文档中找不到此信息。这个库的文档实际上非常稀缺。

我问的原因是我想使用单个循环遍历一个 multi_array 对象(我不关心数组索引)。似乎该库没有提供一种使用单个迭代器迭代数组的方法。因此,作为一种解决方法,我想首先沿单个维度重塑数组(其他维度设置为 1)。然后我可以使用单个循环遍历数组。但是,我不确定reshape() 操作的效率如何。

因此我的第二个问题是:有没有一种简单的方法可以使用单个循环遍历 multi-array 对象的所有元素?

【问题讨论】:

  • “哦,看看源代码!”从那里必须明显! :) [对不起,无法保留;祝你好运]
  • @mlvljr 是的,你是对的! :) 但不确定哪个源文件有定义

标签: c++ iterator time-complexity boost-multi-array


【解决方案1】:

下面是multi_array_ref.hpp文件中reshape函数的实现。

template <typename SizeList>
  void reshape(const SizeList& extents) {
    boost::function_requires<
      CollectionConcept<SizeList> >();
    BOOST_ASSERT(num_elements_ ==
                 std::accumulate(extents.begin(),extents.end(),
                                 size_type(1),std::multiplies<size_type>()));

    std::copy(extents.begin(),extents.end(),extent_list_.begin());
    this->compute_strides(stride_list_,extent_list_,storage_);

    origin_offset_ =
      this->calculate_origin_offset(stride_list_,extent_list_,
                              storage_,index_base_list_);
}

看起来该函数只是重新索引extents 对象中与数组大小相关的元素。该函数与扩展中的元素数量呈线性关系。但我认为它的复杂性在数组中的元素总数中是恒定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多