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
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,
λ> 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
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 |
Creo que no es correcta para cuando haya más de un elemento distinto de 0 en una fila, corregida creo que es así: