我有一个方形矩阵(n * n)的字符,我想翻转图像。
我希望在最快的时间内完成这项工作(暂时不要介意公羊)。
显而易见的选择是逐行复制矩阵,但我认为有更好的方法。 想法?
答案 0 :(得分:4)
垂直翻转很容易快速:只需分配一个额外的临时线,并使用memcpy
在图像/矩阵的顶部和底部之间一次交换整行。
除非你想编写汇编,否则水平翻转很难加速,最佳解决方案将依赖于cpu。
答案 1 :(得分:2)
解决方案1 - 交换指针
根据数据的表示形式(并假设每个字符代表一个“像素”_,它可能只是通过交换指针来完成。例如,如果定义为:
char *matrix[N];
然后动态分配每个“行”(或“列”,具体取决于定义),您可以交换指针。这样做(但是在一个循环中...我只是展示了单个交换的想法):
char* tmp = matrix[0];
matrix[0] = matrix[N-1];
matrix[N-1] = tmp;
根据布局,表示可以是行或列。
解决方案2 - 不要移动/交换任何东西
根据数据的呈现方式,最快的方法可能根本不是翻转数据。只需以不同的顺序显示它。例如,而不是:
for ( r = 0; r < N; r++ )
for ( c = 0; c < N; c++ )
displayMe( r, c, matrix[r][c] );
这样做(或类似的事情):
for ( r = 0; r < N; r++ )
for ( c = 0; c < N; c++ )
displayMe( r, c, matrix[N - r - 1][c] );
答案 2 :(得分:0)
如果您实际需要的是矩阵转置(旋转90度),请查看Transpose a 2D array
答案 3 :(得分:0)
如果您要遍历所有矩阵,强烈建议使用一维数组来表示矩阵,因为嵌套的fors非常昂贵。