Динамически распределяемая двумерная матричная транспозиция (эффективная память) - PullRequest
1 голос
/ 30 марта 2012

Я хочу транспонировать матрицу в C, используя как можно меньше памяти. Поэтому нельзя просто создать копию матрицы, заполнить ее и впоследствии удалить другую. Таким образом, я хочу сделать каждый своп на самой матрице, используя 1 переменную temp для повторного использования. Матричные элементы индексируются с помощью арифметики с указателями, но, насколько я знаю, это правильно. Проблема в том, что функция не приводит к каким-либо изменениям. Структура матрицы динамически размещается и имеет следующую структуру;

typedef struct {
int rows;
int cols;
int** data;
    } matrix;

Функция транспонирования, которую я написал, теперь выглядит следующим образом;

void transpose(matrix* m){
int i,j,temp;
for(i=0;i<m->row;i++){
    for(j=0;j<m->col;j++){
        temp=*((*(m->data+i))+j);
        *((*(m->data+i))+j)=*((*(m->data+j))+i);
        *((*(m->data+j))+i)=temp;
    }
}

}

Я уже пытался запустить функцию с

int* temp=(int*)malloc()sizeof(int);

и заканчивается

 free(temp);

Это дает мне ошибку в Visual Studio по поводу адреса. Любые советы?

1 Ответ

2 голосов
/ 30 марта 2012

Вы индексируете по всей матрице в цикле for (и я предполагаю, что ваша матрица квадратная) ... вам нужно только индексировать по нижнему или верхнему треугольнику матрицы, а затем поменять их местами.позиции с соответствующим индексом в противоположном треугольнике матрицы.Чтобы транспонировать диагональ матрицы, вам нужно только поменять местами верхнюю половину диагонали с нижней.Индексируя по всей матрице, вы в итоге выполняете двойное транспонирование, которое в итоге возвращает тот же результат, что и исходная матрица.

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