Транспонирование матрицы по месту

Можно ли транспонировать(m,n) матрица на месте, давая, что матрица представлена в виде одного массива размераm*n ?

Обычный алгоритм

transpose(Matrix mat,int rows, int cols ){
    //construction step
    Matrix tmat;
    for(int i=0;i<rows;i++){
      for(int j=0;j<cols;j++){
       tmat[j][i] = mat[i][j];
      }
    }
 }

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

РЕДАКТИРОВАТЬ: я уже попробовал все ароматы

for(int i=0;i<n;++i) {
  for(int j=0;j<i;++j) {
     var swap = m[i][j];
     m[i][j] = m[j][i];
     m[j][i] = swap;
  }
}

И это не правильно. В этом конкретном примереm даже не существует. В одной строке матрицыmat[i][j] = mat[i*m + j], гдеtrans[j][i] = trans[i*n + j]

Ответы на вопрос(3)

Ваш ответ на вопрос