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
( 0 0 4 ) ( 0 1 4 )
( 0 5 0 ) ( 0 5 1 )
( 0 0 0 ) |
( 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
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] |
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
dispersion :: (Num a, Eq a) => Matrix a -> Double
esDispersa :: (Num a, Eq a) => Matrix a -> Bool |
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,
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 |
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,
esDispersa ej1 == True
esDispersa ej2 == False
esDispersa (fmap (+1) ej1) == False
esDispersa (identity 3) == True
esDispersa (zero 9 9) == True |
esDispersa ej1 == True
esDispersa ej2 == False
esDispersa (fmap (+1) ej1) == False
esDispersa (identity 3) == True
esDispersa (zero 9 9) == True
Soluciones
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 (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
Se puede imprimir o compartir con
import Data.Matrix
import Data.List
Se puede definir dispersion sin usar argumentos