处理矩阵的边界单元
我想处理nxn矩阵的每个边界单元格。 例如,对于int数组[5] [5]; 算法应该处理每个x元素,因此它具有forms
xxxxxx - - - x x - - - x x - - - x xxxxx
处理这种细胞的最佳方法是什么? 如果它是一个三维数组怎么样? 在此先感谢,并对矩阵表示感到抱歉。
编辑我想只使用一个循环以避免嵌套循环或递归。
想象一下触摸每个元素有它的成本,你只想触摸边框元素。
显然,这不是一般的优化。 但是在图像处理方面,我的表现非常出色。 我的意思是,它取决于你在你的情况下测试并决定。
在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
您基本上希望处理数组中每个维度的index == 0
和index == 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]); } } }
因此,对于5x5arrays,调用将是:
processNXNBorders(arr, 5, 5);