Как разбить массив A * A std :: на куски B * B?

если у меня есть std::array<std::array<int, 4>, 4> mydataКак бы я разделить это на более мелкие куски или std::array<std::array<int, 2>, 2>так это будет выглядеть (визуально):

введите описание изображения здесь

где каждый цвет один std::array<std::array<int, 2>, 2>?

Я прочитал несколько вопросов, но они не всегда задают то же самое или являются неполными:

Разбить массив на куски в C / C ++ — спрашивает, как разбить один непрерывный поток данных на более мелкие непрерывные биты, одномерные

Разделить изображение на части размером 64×64 — источник или объяснение не предоставлено ProcessChunk?

1

Решение

То, как я бы это сделал, не расщепление изображения на всех.
позвольте мне уточнить:

если вы создаете новые массивы, вам придется копировать массивы поверх какой-то новой структуры, возможно, std :: vectors, поскольку вы не знаете разных размеров во время компиляции.

Вместо этого вы можете сохранить первоначальную структуру и иметь вектор областей, где область описывается четырьмя вершинами, которые описывают ваш внутренний квадрат.

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

Другие решения

Напишите свою собственную функцию, чтобы сделать это. Это довольно просто, что-то вроде:

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;
}
0

По вопросам рекламы [email protected]