Ir al contenido principal

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

|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

Definir la función

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]

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))