处理矩阵的边界单元

时间:2013-03-23 16:35:06

标签: c multidimensional-array

我想处理 nxn 矩阵的每个边界单元格。例如,对于 int array [5] [5]; 算法应处理每个 x 元素,因此它具有

形式
   x x x x x 
   x - - - x
   x - - - x
   x - - - x
   x x x x x

处理这种细胞的最佳方法是什么?如果它是一个三维数组怎么样?在此先感谢,并对矩阵表示感到抱歉。

编辑我我想只使用一个循环以避免嵌套循环或递归。

2 个答案:

答案 0 :(得分:1)

想象一下,触摸每个元素都有它的成本,而你只想触摸边框元素。

显然,这不是一般的优化。但是在图像处理方面,我有很好的表现。 我的意思是,这取决于你在你的情况下测试它并决定。

在2D数组中,您可以使ptr指向矩阵并逐步进行。

void process(char i)
{
    cout << i;
}

int main()
{
    const int N = 5;
    char mat[N][N] = {
        {'a', 'b', 'c', 'd', 'e'},
        {'f', '-', '-', '-', 'g'},
        {'h', '-', '-', '-', 'i'},
        {'j', '-', '-', '-', 'k'},
        {'l', 'm', 'n', 'o', 'p'}
    };

    char *ptr = (char*) mat;

    for (int i = 0; i < N - 1; ++i) // Process first row
        process(*ptr++);

    for (int i = 0; i < N - 2; ++i) // Process column borders
    {
        process(*ptr);
        process(*(ptr + 1));
        ptr += N;
    }

    for (int i = 0; i <= N; ++i)    // Process last row
        process(*ptr++);

    cout << endl;
}

输出:

  

abcdefghijklmnop

答案 1 :(得分:-1)

您基本上希望处理数组中每个维度index == 0index == size的情况。假设process()是你的处理函数并且接受一个int参数。

void processNXNBorders(int** twoDArray, int dimonesize, int dimtwosize) {
    for (int i = 0; i < dimonesize; i++) {
        if (i == 0 || i == dimonesize-1) {
            // Process entire row
            for (int j = 0; j < dimtwosize; j++) {
                 process(twoDArray[i][j]);
            }
        } else {
            // Only first and last elements in this row.
            process(twoDArray[i][0]);
            process(twoDArray[i][dimtwosize-1]);
        }
    }
}

因此,对于5x5阵列,调用将是:

processNXNBorders(arr, 5, 5);