2016-06-21 3 views
3

Я пытаюсь понять, ниже код, который переставляет матрицу на строки х цвТранспонирование матрицы: Как этот код транспонирования матрицы

int transpose(int* a, int row, int col) 
{ 
    for(int i = 0; i < row*col; i++) 
    { 
     int old = i; 
     do 
     { 
      old = (old%row)*col + old/row; 
     } 
     while(old < i) 
     swap(a[i],a[old]) 
    } 
} 

Что эта линия (old = (old%row)*col + old/row) делает?

+0

По-видимому, внешняя петля итерации по всем элементам матрицы. Однако не каждый элемент должен быть обменен со своим партнером; Мне это трудно понять. Я нахожу это немного странным, что, очевидно, значение 'old' не может измениться по мере повторения цикла while. – Codor

+1

Это следующие перестановочные циклы. См. Здесь: https://en.wikipedia.org/wiki/In-place_matrix_transposition – samgak

+0

Первый и последний элементы останутся на своем месте. Другие элементы будут обмениваться. То, что я понял до сих пор, для каждого элемента a [i] мы пытаемся найти его старое положение и поменять его – Bhuwan

ответ

0

Матрица хранится в одномерном массиве размером row*col. Индекс массива равен i=r*col+c, считая, что c является текущим столбцом и r текущей строкой. Чтобы вычислить строку из индекса, используйте целочисленное деление r=i/col, чтобы получить индекс столбца, используйте остаток c=i%col.

В приведенной строке old - это индекс массива. Оператор вычисляет новый индекс для транспонированного элемента, поскольку деление и остаток не вычисляются с col, как показано выше, но с row.

Цилиндр do while предотвращает двойную замену элементов. Однако мне трудно понять и полагать, что должен быть лучший способ сделать это.

+0

Существует лучший (более понятный и, вероятно, более быстрый) способ, но для хранения уже обмененных индексов элементов требуется некоторая память. https://en.wikipedia.org/wiki/In-place_matrix_transposition – MBo