如何将A * A std ::数组拆分成B * B的块?

时间:2014-11-20 20:25:06

标签: c++ arrays c++11 chunks chunking

如果我有std::array<std::array<int, 4>, 4> mydata,我将如何将其拆分为更小的块或std::array<std::array<int, 2>, 2>,所以它看起来像这样(视觉上):

enter image description here

每种颜色是一个std::array<std::array<int, 2>, 2>

我已经阅读了一些问题,但他们并不总是问相同或不完整:

Split array into chunks in C/C++ - 询问如何将一个连续的数据流拆分成较小的连续位,一维

Split an image into 64x64 chunks - 没有为ProcessChunk提供来源或解释?

2 个答案:

答案 0 :(得分:1)

我这样做的方法是分割图像。
让我详细说明:

如果你创建新的数组,你将不得不在一些新的结构上复制数组,可能是std :: vectors,因为你不知道编译时的不同大小。

你可以做的是保持原始结构,并有一个区域矢量,其中一个区域由描述你的内部正方形的4个顶点描述。

struct Area{
  std::pair<int,int> topleft;
  std::pair<int,int> topright;
  std::pair<int,int> bottomleft;
  std::pair<int,int> bottomright;
};

vector<Area> areas;
areas.emplace_back({0,0},{0,2},{2,0},{2,2});

如果您需要使用较少的信息,您只能存储两个角并计算另外两个角,实际上只需要4个整数来了解该区域。

答案 1 :(得分:0)

编写自己的函数来完成它。它非常简单,类似于:

Array3D splitArray(Array2D inArray, uint rows, uint cols)
{

   //Check if the array size are > 0, skipping this to save time

   //Check if the arrays 
   size_t inSize1 = inArray.size();
   size_t inSize2 = inArray[0].size();

   if rows > inSize1 || colus > inSize2 || inSize1 % rows != 0 || inSize2 % cols != 0
   {
      //throw an exception
   }

   //The arrays split requested is OK, copy the data:
   //Loop over the inArray and copy the appropriate cells in a temp 2D array
   //then add that to an array of 2D arrays:
   std::Array<Array2D> results;
   return results;
}