我编写了以下函数,通过根据需要添加行或列(其中sizeX, sizeY, get, set和resize是不言自清的grid2D成员函数),使二维数组对象奇数维。
void makeOdd(grid2D<double> *pSrc)
// ---------------------------------------------------------------------------------------------------------
// Make one or both dimensions of input array odd (via row/column copy).
{
// Variable declarations
grid2D<double> pTmp = *pSrc; // Scratch local source variable
int simax, sjmax; // Source dimensions
// Get source dimensions
sjmax = pSrc->sizeY();
simax = pSrc->sizeX();
// Check if source is already odd-dimensioned
if (sjmax%2 && simax%2) return;
// Extend row/column of source if necessary
if (sjmax%2 && !(simax%2)) // Odd rows, even columns
{
pSrc->resize(simax+1,sjmax); // Resize source with extra column
for(int i=0; i<simax+1; i++)
{
for(int j=0; j<sjmax; j++)
{
if(i==simax)
pSrc->set(i,j,pTmp.get(simax-1,j)); // Copy last column
else
pSrc->set(i,j,pTmp.get(i,j));
}
}
return;
}
else if (!(sjmax%2) && simax%2) // Even rows, odd columns
{
pSrc->resize(simax,sjmax+1); // Resize source with extra row
for(int i=0; i<simax; i++)
{
for(int j=0; j<sjmax+1; j++)
{
if(i==simax)
pSrc->set(i,j,pTmp.get(i,sjmax-1)); // Copy last row
else
pSrc->set(i,j,pTmp.get(i,j));
}
}
return;
}
else // Even rows, even columns
{
pSrc->resize(simax+1,sjmax+1); // Resize source with extra row and column
for(int i=0; i<simax+1; i++)
{
for(int j=0; j<sjmax+1; j++)
{
if(i==simax && j==sjmax)
{
pSrc->set(i,j,pTmp.get(simax-1,sjmax-1)); // Copy last column and row
}
else if(i==simax && j<sjmax)
{
pSrc->set(i,j,pTmp.get(simax-1,j)); // Copy last column
}
else if(i<simax && j==sjmax)
{
pSrc->set(i,j,pTmp.get(i,sjmax-1)); // Copy last row
}
else
{
pSrc->set(i,j,pTmp.get(i,j));
}
}
}
return;
}
}
我的问题是:有没有更干净/更有效的方法来做这件事?
多谢…
我认为首先检查行数会更容易,并在需要时将其扩展1。然后,检查列的数量,如果需要,将每个列扩展1。
假设你的grid2d
是一个围绕vector<vector<T> >
的包装器,你可以传递一个值给resize
,它将用来填充新创建的空间,所以当你添加一行时,你可以只传递当前的最后一行来复制到新的最后一行。
对于这个问题,你的代码在我看来相当复杂…我将使用
void makeOdd(grid2D<double> *pSrc)
{
int ny = pSrc->sizeY();
int nx = pSrc->sizeX();
int oddnx = nx + (nx % 2 == 0);
int oddny = ny + (ny % 2 == 0);
if (nx != oddnx || ny != oddny)
{
pSrc->resize(oddnx, oddny);
if (nx != oddnx)
for (int y=0; y<ny; y++)
pSrc->set(nx, y, pSrc->get(nx-1, y));
if (ny != oddny)
for (int x=0; x<oddnx; x++)
pSrc->set(x, ny, pSrc->get(x, ny-1));
}
}
当然,根据grid2D
,如果知道对象的内部结构,而不是使用公共的resize/get/set接口(例如,通过使makeOdd
成为一个方法),这可能会更简单。
顺便说一下,在你的原始代码中,你正在复制一个指针的pTmp
(不是原始对象);这也是没有意义的。