Operaciones binarias con matrices
Entre dos matrices de la misma dimensión se pueden aplicar distintas operaciones binarias entre los elementos en la misma posición. Por ejemplo, si a y b son las matrices
1 2 |
|3 4 6| |1 4 2| |5 6 7| |2 1 2| |
entonces a+b y a-b son, respectivamente
1 2 |
|4 8 8| |2 0 4| |7 7 9| |3 5 5 |
Definir la función
1 2 |
opMatriz :: (Int -> Int -> Int) -> Matriz Int -> Matriz Int -> Matriz Int |
tal que (opMatriz f p q) es la matriz obtenida aplicando la operación f entre los elementos de p y q de la misma posición. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 |
λ> a = listArray ((1,1),(2,3)) [3,4,6,5,6,7] λ> b = listArray ((1,1),(2,3)) [1,4,2,2,1,2] λ> elems (opMatriz (+) a b) [4,8,8,7,7,9] λ> elems (opMatriz max a b) [3,4,6,5,6,7] λ> c = listArray ((1,1),(2,2)) ["ab","c","d","ef"] λ> d = listArray ((1,1),(2,2)) [3,1,0,5] λ> elems (opMatriz menor c d) [True,False,False,True] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import Data.Array -- 1ª solución opMatriz :: (a -> b -> c) -> Array (Int,Int) a -> Array (Int,Int) b -> Array (Int,Int) c opMatriz f p q = array (bounds p) [(k, f (p!k) (q!k)) | k <- indices p] -- 2ª solución opMatriz2 :: (a -> b -> c) -> Array (Int,Int) a -> Array (Int,Int) b -> Array (Int,Int) c opMatriz2 f p q = listArray (bounds p) [f x y | (x,y) <- zip (elems p) (elems q)] -- 3ª solución opMatriz3 :: (a -> b -> c) -> Array (Int,Int) a -> Array (Int,Int) b -> Array (Int,Int) c opMatriz3 f p q = listArray (bounds p) (zipWith f (elems p) (elems q)) |
Y la versión sin argumentos: