Tal como vimos en el problema Matrices dispersas (1):
conversión, una matriz dispersa sólo almacena los
elementos no nulos. Los tipos usados (definidos en
matrius.hh) son los mismos:
struct Casella {
int pos; // índice de columna
int valor; // valor del elemento
};
struct MatriuEsparsa {
int ncols; // número de columnas
vector<list<Casella>> files; // filas de la matriz dispersa
};
La transpuesta de una matriz es la matriz que se obtiene intercambiando filas y columnas: el elemento en la posición del original pasa a la posición de la transpuesta.
Escribe la siguiente función:
/**
* @brief Calcula la transpuesta de una MatriuEsparsa.
*
* @param S MatriuEsparsa de S.files.size() filas y S.ncols columnas.
*
* @pre S es una MatriuEsparsa válida. Las posiciones de las casillas van de 0 a S.ncols-1.
* @post Devuelve una nueva MatriuEsparsa T con T.ncols == S.files.size() y
* T.files.size() == S.ncols, donde T.files[j] contiene las casillas
* {i, S.files[i][j].valor} de S, ordenadas por columna ascendentemente.
*/
MatriuEsparsa matriu_esparsa_transposa(const MatriuEsparsa& S);
Los ficheros públicos (icono del gatito) contienen:
main.cc |
el programa principal, con la entrada/salida hecha |
matrius.hh |
los tipos Casella y
MatriuEsparsa |
Makefile |
para compilar con make
cómodamente |
.vscode |
carpeta para compilar y depurar con VSCode |
Hay que enviar únicamente la implementación de la función
matriu_esparsa_transposa, incluyendo el include de
matrius.hh. No hace falta enviar el main.
La primera línea contiene dos enteros
y
(),
el número de filas y columnas de la matriz dispersa de entrada. A
continuación hay
líneas, cada una con las casillas no nulas de la fila como pares
(col,val) separados por espacios, seguidos de un punto
.. Las filas sin elementos no nulos se representan como
..
La matriz dispersa transpuesta en el mismo formato que la entrada: la
primera línea contiene las dimensiones
de la transpuesta, seguida de
líneas con las casillas no nulas de cada fila, seguidas de un punto
..
Input
3 4 (1,3). (2,5). (0,1) (3,7).
Output
4 3 (2,1). (0,3). (1,5). (2,7).
Input
4 4 (0,1) (3,2). . (1,-3). (0,5) (2,6).
Output
4 4 (0,1) (3,5). (2,-3). (3,6). (0,2).