cómo intercambiar elementos de matriz para transferir la matriz de una columna similar a una representación de fila

Por ejemplo: la matriz

a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3 

representa la siguiente tabla

 a1, b1, c1, d1 a2, b2, c2, d2 a3, b3, c3, d3 

ahora me gusta poner la matriz en la siguiente forma

 a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3 

¿Existe un algoritmo, que toma la matriz (de la primera forma) y las dimensiones de la tabla como argumentos de entrada y que transfiere la matriz a la segunda forma? Pensé en un algoritmo que no necesita asignar memoria adicional, sino que creo que debería ser posible realizar el trabajo con operaciones de intercambio de elementos.

El término que está buscando es una transposición de matriz en el lugar , y aquí hay una implementación .

Wikipedia dedica un artículo a este proceso, que se llama Transposición de matriz in situ.

http://en.wikipedia.org/wiki/In-place_matrix_transposition

Esto no es más que una transposición de matriz en el lugar . Algunos pseudocódigo:

 for n = 0 to N - 2 for m = n + 1 to N - 1 swap A(n,m) with A(m,n) 

Como puede ver, necesitará 2 índices para acceder a un elemento. Esto se puede hacer transformando (n,m) a nP+m siendo P el número de columnas.

¿Por qué molestarse? Si se colocan en una matriz 1-D y sabe cuántos elementos hay en una fila / intervalo lógico, entonces puede obtener secuencialmente en cualquier índice con un poco de aritmética.

 int index(int row, int col, int elements) { return ((row * elements) + col); } int inverted_index(int row, int col, int elements) { return ((col * elements) + row); } 

entonces cuando accedes a los elementos puedes decir algo como …

 array[index(row, col, elements)]; array[inverted_index(row, col, elements)]; 

Realizo la mayor parte de mi manipulación básica de matrices de esta manera precisamente por la razón por la que puedo transponer una matriz simplemente indexándola de manera diferente sin ningún tipo de memoria. También es lo más rápido que puedes hacer con una computadora.

Puede seguir el mismo principio y abordar su primera matriz en términos que satisfagan las necesidades de su ejemplo final con algo de su propia aritmética.