Ищем самый быстрый алгоритм (реализующий в C) для работы с изображениями - PullRequest
1 голос
/ 26 января 2012

У меня есть квадратная матрица (n * n) символов, и я хочу перевернуть изображение.

Я хочу сделать это как можно быстрее (не обращайте внимания навсе на данный момент).

Очевидный выбор будет просто копировать матрицу построчно, но я думаю, что есть лучший способ.идеи?

Ответы [ 4 ]

4 голосов
/ 26 января 2012

Перелистывание по вертикали довольно легко сделать быстро: просто выделите дополнительную временную линию и используйте memcpy, чтобы поменять местами целые строки за раз между верхом и низом изображения / матрицы.

Поворот по горизонтали - этотрудно ускорить, если вы не хотите писать ассемблер, а оптимальное решение будет сильно зависеть от процессора.

2 голосов
/ 26 января 2012

Решение 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] );
0 голосов
/ 27 января 2012

Если вы собираетесь пройтись по всей своей матрице, настоятельно рекомендуется использовать одномерный массив для представления вашей матрицы, потому что вложенные форы очень дороги.

0 голосов
/ 26 января 2012

Если то, что вы на самом деле ищете, это транспонирование матрицы (поворот на 90 градусов), посмотрите на Транспонирование двумерного массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...