I1M2017: Matrices en Haskell
En la clase de hoy del curso de Informática de 1º del Grado en Matemáticas se ha estudiado cómo trabajar con tablas en Haskell usando el módulo Data.Array.
En la primera parte se ha explicado el tipo predefinido de las tablas (“arrays”) se han estudiado las funciones sobre índices (range, index, inRange, rangeSize) y sobre tablas (array, (!), bounds, indices, elems, assocs, (//), listArray y accumArray). También se han estudiado ejemplos de definiciones con dichas funciones.
En la segunda parte se han comentado las soluciones de los siguientes ejercicios de la Relación 19.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
-- --------------------------------------------------------------------- -- Importación de librerías -- -- --------------------------------------------------------------------- import Data.Array -- --------------------------------------------------------------------- -- Tipos de los vectores y de las matrices -- -- --------------------------------------------------------------------- -- Los vectores son tablas cuyos índices son números naturales. type Vector a = Array Int a -- Las matrices son tablas cuyos índices son pares de números -- naturales. type Matriz a = Array (Int,Int) a -- --------------------------------------------------------------------- -- Operaciones básicas con matrices -- -- --------------------------------------------------------------------- -- --------------------------------------------------------------------- -- Ejercicio 1. Definir la función -- listaVector :: Num a => [a] -> Vector a -- tal que (listaVector xs) es el vector correspondiente a la lista -- xs. Por ejemplo, -- ghci> listaVector [3,2,5] -- array (1,3) [(1,3),(2,2),(3,5)] -- --------------------------------------------------------------------- listaVector :: Num a => [a] -> Vector a listaVector xs = listArray (1,n) xs where n = length xs -- --------------------------------------------------------------------- -- Ejercicio 2. Definir la función -- listaMatriz :: Num a => [[a]] -> Matriz a -- tal que (listaMatriz xss) es la matriz cuyas filas son los elementos -- de xss. Por ejemplo, -- ghci> listaMatriz [[1,3,5],[2,4,7]] -- array ((1,1),(2,3)) [((1,1),1),((1,2),3),((1,3),5), -- ((2,1),2),((2,2),4),((2,3),7)] -- --------------------------------------------------------------------- listaMatriz :: Num a => [[a]] -> Matriz a listaMatriz xss = listArray ((1,1),(m,n)) (concat xss) where m = length xss n = length (head xss) -- --------------------------------------------------------------------- -- Ejercicio 3. Definir la función -- numFilas :: Num a => Matriz a -> Int -- tal que (numFilas m) es el número de filas de la matriz m. Por -- ejemplo, -- numFilas (listaMatriz [[1,3,5],[2,4,7]]) == 2 -- --------------------------------------------------------------------- numFilas :: Num a => Matriz a -> Int numFilas = fst . snd . bounds -- --------------------------------------------------------------------- -- Ejercicio 4. Definir la función -- numColumnas :: Num a => Matriz a -> Int -- tal que (numColumnas m) es el número de columnas de la matriz -- m. Por ejemplo, -- numColumnas (listaMatriz [[1,3,5],[2,4,7]]) == 3 -- --------------------------------------------------------------------- numColumnas:: Num a => Matriz a -> Int numColumnas = snd . snd . bounds -- --------------------------------------------------------------------- -- Ejercicio 5. Definir la función -- dimension :: Num a => Matriz a -> (Int,Int) -- tal que (dimension m) es la dimensión de la matriz m. Por ejemplo, -- dimension (listaMatriz [[1,3,5],[2,4,7]]) == (2,3) -- --------------------------------------------------------------------- dimension :: Num a => Matriz a -> (Int,Int) dimension = snd . bounds -- --------------------------------------------------------------------- -- Ejercicio 9. Definir la función -- sumaMatrices:: Num a => Matriz a -> Matriz a -> Matriz a -- tal que (sumaMatrices x y) es la suma de las matrices x e y. Por -- ejemplo, -- ghci> let m1 = listaMatriz [[5,1,0],[3,2,6]] -- ghci> let m2 = listaMatriz [[4,6,3],[1,5,2]] -- ghci> matrizLista (sumaMatrices m1 m2) -- [[9,7,3],[4,7,8]] -- --------------------------------------------------------------------- -- 1ª definición sumaMatrices :: Num a => Matriz a -> Matriz a -> Matriz a sumaMatrices p q = array ((1,1),(m,n)) [((i,j),p!(i,j)+q!(i,j)) | i <- [1..m], j <- [1..n]] where (m,n) = dimension p -- 2ª definición sumaMatrices2 :: Num a => Matriz a -> Matriz a -> Matriz a sumaMatrices2 p q = listArray (bounds p) (zipWith (+) (elems p) (elems q)) |