我有一个大小为NxM的大型2D矢量
vector<vector<int> > grid;
我需要通过将其除以固定数字来缩小它 例如。 N = 194 M = 231需缩小7(向上舍入) 这意味着新网格的大小必须为N = 28 M = 33。
原始网格有0和1,所以我需要将数组分解为7x7块,如果所有值== 0则新网格中的单元格= 0,但如果至少有一个值是1,然后新单元格中的值必须为1.
我写了一些函数,但似乎无法得到它。 任何帮助将非常感激。
我尝试过这样的东西,我发现并试图适应
for (int i=0; i < rows - k_rows + 1; i++)
{
for (int j=0; j < cols -k_cols + 1; j++)
{
int sum = 0;
for (int p=i; p< k_rows +i; p++)
for (int q=j; q < k_cols + j; q++)
sum += mat[p][q];
file << sum;
}
file << endl;
答案 0 :(得分:2)
虽然我认为user45891是正确的,但是存在一个常见的图像处理问题。但是,这是一个非常不准确的版本。所以我不打算这样做。我写了一个完整的示例程序(~80行)。
以下是一些想法: 创建一个你想要它的大小的新矩阵,并将其初始化为false(我使用布尔值,因为你只想要0和1)。 迭代这个新的(较小的)矩阵并将每个值设置为函数的返回值,该函数搜索原始矩阵的子集1秒。
- &GT;您将通过此函数传递要搜索原始矩阵的x1,x2-&gt; y1,y2范围
- &GT;使用收缩因子计算该范围
这个新函数did_i_find_a_one(x,x2,y,y2)只返回该块中是否有1。
除了以下代码之外,我还编写了显示矩阵的函数,以便我可以看到结果。但我认为这是它的核心。我认为如果你有非常大的地图,可能会有更好的方法。但天真地说,这不会那么糟糕。
typedef unsigned int uint;
typedef vector<bool> boolvector;
typedef vector<boolvector> matrix;
void initialize( matrix &i, uint newx, uint newy ) {
i.resize(newy);
for( auto it = i.begin(); it != i.end(); ++it) {
it->resize(newx,0);
}
}
void shrink( matrix &orig, matrix &to, uint factor=10 ) {
uint _y=orig.size();
uint _x=orig[0].size();
uint newy=(_y + factor - 1)/factor; //round up division
uint newx=(_x + factor - 1)/factor;
initialize(to, newx, newy)
for (uint y=0; y<newy; ++y) {
for (uint x=0; x<newx; ++x) {
to[y][x]=is_one_in_block(x*factor,(x+1)*factor-1,y*factor,(y+1)*factor-1);
}
}
}
bool is_one_in_block( matrix & _i, uint x1, uint x2, uint y1, uint y2) {
uint _y=_i.size();
uint _x=_i[0].size();
if (y2>_y-1) y2=_y-1; //over max protection
if (x2>_x-1) x2=_x-1; //over max protection
for (uint y=y1; y<=y2; ++y)
for (uint x=x1; x<=x2; ++x)
if (_i[y][x])
return true;
}
return false;
}
答案 1 :(得分:0)
您的问题听起来与在图像处理中使用滤镜非常相似。在这种情况下,您可以让convolution matrix(在裁剪模式下)滑过图像。
Wiki文章有示例代码,我将概述这里的一般步骤:
在x和y维度中迭代2d向量。但是不要从索引0开始 - 从shrinkFactor/2
开始并迭代到.size() - shrinkFactor/2
。
收集卷积矩阵/块。创建一个新的1d数组并运行两个循环可能是最简单的。外部的x - shrinkFactor/2
到x + shrinkFactor/2
,反之亦然。