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
|3 4 6| |1 4 2|
|5 6 7| |2 1 2| |
|3 4 6| |1 4 2|
|5 6 7| |2 1 2|
entonces a+b y a-b son, respectivamente
|4 8 8| |2 0 4|
|7 7 9| |3 5 5 |
|4 8 8| |2 0 4|
|7 7 9| |3 5 5
Definir la función
opMatriz :: (Int -> Int -> Int) ->
Matriz Int -> Matriz Int -> Matriz Int |
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,
λ> 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] |
λ> 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
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)) |
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))
Se puede imprimir o compartir con
Y la versión sin argumentos: