Representación ampliada de matrices dispersas
En el ejercicio anterior se explicó una representación reducida de las matrices dispersas. A partir del número de columnas y la representación reducida se puede construir la matriz.
Definir la función
1 |
ampliada :: Num a => Int -> [[(Int,a)]] -> Matrix a |
tal que (ampliada n xss) es la matriz con n columnas cuya representación reducida es xss. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
λ> ampliada 3 [[(3,4)],[(2,5)],[]] ( 0 0 4 ) ( 0 5 0 ) ( 0 0 0 ) λ> ampliada 3 [[],[]] ( 0 0 0 ) ( 0 0 0 ) λ> ampliada 2 [[],[],[]] ( 0 0 ) ( 0 0 ) ( 0 0 ) |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import Data.Matrix (Matrix, fromLists) import Data.List (lookup) ampliada :: Num a => Int -> [[(Int,a)]] -> Matrix a ampliada n xss = fromLists [filaAmpliada n xs | xs <- xss] -- Se puede redefinir con un argumento ampliada2 :: Num a => Int -> [[(Int,a)]] -> Matrix a ampliada2 n = fromLists . map (filaAmpliada n) -- Se puede redefinir sin argumentos usando las siguientes reducciones -- fromLists . map (filaAmpliada n) -- = fromLists . ((map . filaAmpliada) n) -- = ((fromLists .) . (map . filaAmpliada)) n -- = ((fromLists .) . map . filaAmpliada) n ampliada3 :: Num a => Int -> [[(Int,a)]] -> Matrix a ampliada3 = (fromLists .) . map . filaAmpliada -- (filaAmpliada n xs) es la fila ampliada de la representación reducida -- xs de una matriz con n columnas. Por ejemplo, -- filaAmpliada 3 [(2,5)] == [0,5,0] -- filaAmpliada 7 [(2,5),(1,3)] == [3,5,0,0,0,0,0] filaAmpliada :: Num a => Int -> [(Int,a)] -> [a] filaAmpliada n xs = [f (lookup i xs) | i <- [1..n]] where f Nothing = 0 f (Just x) = x |