Matrices dispersas
Una matriz es dispersa si la mayoriá de sus elementos son ceros. Por ejemplo, la primera de las siguientes matrices es dispersa y la segunda no lo es
1 2 3 |
( 0 0 4 ) ( 0 1 4 ) ( 0 5 0 ) ( 0 5 1 ) ( 0 0 0 ) |
Usando la librería Data.Matrix, las anteriores matrices se pueden definir por
1 2 3 |
ej1, ej2 :: Matrix Int ej1 = fromList 3 3 [0,0,4,0,5,0,0,0,0] ej2 = fromList 2 3 [0,1,4,0,5,1] |
La dispersión de una matriz es el cociente entre el número de ceros de la matriz y el producto de sus números de filas y de columnas.
Definir las siguientes funciones
1 2 |
dispersion :: (Num a, Eq a) => Matrix a -> Double esDispersa :: (Num a, Eq a) => Matrix a -> Bool |
tales que
- (dispersion p) es la dispersión de la matriz p. Por ejemplo,
1 2 3 4 5 |
dispersion ej1 == 0.7777777777777778 dispersion ej2 == 0.3333333333333333 dispersion (fmap (+1) ej1) == 0.0 dispersion (identity 3) == 0.6666666666666666 dispersion (zero 9 9) == 1.0 |
- (esDispersa p) se verifica si la matriz p es dispersa. Por ejemplo,
1 2 3 4 5 |
esDispersa ej1 == True esDispersa ej2 == False esDispersa (fmap (+1) ej1) == False esDispersa (identity 3) == True esDispersa (zero 9 9) == True |
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 |
import Data.Matrix (Matrix, fromList, nrows, ncols, toList) ej1, ej2 :: Matrix Int ej1 = fromList 3 3 [0,0,4,0,5,0,0,0,0] ej2 = fromList 2 3 [0,1,4,0,5,1] dispersion :: (Num a, Eq a) => Matrix a -> Double dispersion p = fi nCeros / (fi nrows * fi ncols) where fi f = (fromIntegral . f) p -- (nCeros p) es el número de ceros de la matriz p. Por ejemplo, -- nCeros ej1 == 7 -- nCeros ej2 == 2 nCeros :: (Num a, Eq a) => Matrix a -> Int nCeros p = length (filter (== 0) (toList p)) -- La función anterior se puede definir sin argumentos: nCeros2 :: (Num a, Eq a) => Matrix a -> Int nCeros2 = length . filter (== 0) . toList esDispersa :: (Num a, Eq a) => Matrix a -> Bool esDispersa p = dispersion p > 0.5 -- La función anterior se puede definir sin argumentos: esDispersa2 :: (Num a, Eq a) => Matrix a -> Bool esDispersa2 = (> 0.5) . dispersion |
import Data.Matrix
import Data.List
Se puede definir dispersion sin usar argumentos