Ir al contenido principal

Representación reducida de matrices dispersas

Una representación reducida de una matriz dispersa es una lista de listas donde cada una de las listas representa una fila de la matriz mediante listas de pares correspondientes a las snúmeros de columnas con valores no nulos de la matriz. Por ejemplo, la representación reducida de la matriz

( 0 0 4 )
( 0 5 0 )
( 0 0 0 )

es [[(3,4)],[(2,5)],[]].

Definir la función

reducida :: (Num a, Eq a) => Matrix a -> [[(Int,a)]]

tal que (reducida p) es la representación reducida de la matriz p. Por ejemplo,

reducida (fromList 3 3 [0,0,4,0,5,0,0,0,0])  ==  [[(3,4)],[(2,5)],[]]
reducida (identity 3)  ==  [[(1,1)],[(2,1)],[(3,1)]]
reducida (zero 9 3)    ==  [[],[],[],[],[],[],[],[],[]]
reducida (zero 9 4)    ==  [[],[],[],[],[],[],[],[],[]]

Soluciones

import Data.Matrix (Matrix, (!), nrows, ncols)

reducida :: (Num a, Eq a) => Matrix a -> [[(Int,a)]]
reducida p =
  [[(j,x) | j <- [1..n], let x = p!(i,j), x /= 0] | i <- [1..m]]
  where m = nrows p
        n = ncols p