Menu Close

Producto de Kronecker

Si A es una matriz m \times n y B es una matriz p \times q, entonces el producto de Kronecker A \otimes B es la matriz bloque mp \times nq

Más explícitamente, tenemos

Por ejemplo,

Definir la función

   kronecker :: Num t => Matrix t -> Matrix t -> Matrix t

tal que (kronecker a b) es el producto de Kronecker de las matrices a y b. Por ejemplo,

   λ> kronecker (fromLists [[1,2],[3,1]]) (fromLists [[0,3],[2,1]])
   ┌         ┐
   │ 0 3 0 6 │
   │ 2 1 4 2 │
   │ 0 9 0 3 │
   │ 6 3 2 1 │
   └         ┘
   λ> kronecker (fromLists [[1,2],[3,4]]) (fromLists [[2,1],[-1,0],[3,2]])
   ┌             ┐
   │  2  1  4  2 │
   │ -1  0 -2  0 │
   │  3  2  6  4 │
   │  6  3  8  4 │
   │ -3  0 -4  0 │
   │  9  6 12  8 │
   └             ┘
   λ> kronecker (fromLists [[2,1],[-1,0],[3,2]]) (fromLists [[1,2],[3,4]])
   ┌             ┐
   │  2  4  1  2 │
   │  6  8  3  4 │
   │ -1 -2  0  0 │
   │ -3 -4  0  0 │
   │  3  6  2  4 │
   │  9 12  6  8 │
   └             ┘

Soluciones

import Data.Matrix
 
-- 1ª solución
-- ===========
 
kronecker :: Num t => Matrix t -> Matrix t -> Matrix t
kronecker a b =
  matrix (m*p) (n*q) f
  where m = nrows a
        n = ncols a
        p = nrows b
        q = ncols b
        f (i,j) = a !(k+1,r+1) * b!(l+1,s+1)
          where (k,l) = quotRem (i-1) p
                (r,s) = quotRem (j-1) q
 
-- 2ª solución
-- ===========
 
kronecker2 a b = bloqueFila a b (ncols a)
  where
    bloque (i,j) a b = scaleMatrix (a!(i,j)) b
    bloqueFila a b 1 = bloqueColumna 1 a b
    bloqueFila a b n = bloqueFila a b (n-1) <|> bloqueColumna n a b
    bloqueColumna j a b = aux a b (nrows a)
      where aux a b 1 = bloque (1,j) a b
            aux a b n = aux a b (n-1) <-> bloque (n,j) a b
 
-- 3ª solución
-- ===========
 
kronecker3 :: Num t => Matrix t -> Matrix t -> Matrix t
kronecker3 a b =
  foldl1 (<->) [foldl1 (<|>) [scaleMatrix (a!(i,j)) b
                             | j <- [1..ncols b]]
                             | i <- [1..nrows a]]

Otras soluciones

  • Se pueden escribir otras soluciones en los comentarios.
  • El código se debe escribir entre una línea con <pre lang=”haskell”> y otra con </pre>

Pensamiento

“La resolución de problemas es una habilidad práctica como, digamos, la natación. Adquirimos cualquier habilidad práctica por imitación y práctica. Tratando de nadar, imitas lo que otras personas hacen con sus manos y pies para mantener sus cabezas sobre el agua, y, finalmente, aprendes a nadar practicando la natación. Al intentar resolver problemas, hay que observar e imitar lo que hacen otras personas al resolver problemas y, finalmente, se aprende a resolver problemas haciéndolos.”

George Pólya.

4 soluciones de “Producto de Kronecker

  1. fercarnav
    import Data.Matrix
     
    kronecker :: Num t => Matrix t -> Matrix t -> Matrix t
    kronecker p q = matrix m n ((i,j) -> p!(h i,k j) * q!(f i,g j))
      where m = nrows p * nrows q
            n = ncols p * ncols q
            f r = mod (r-1) (nrows q) +1 
            g c = mod (c-1) (ncols q) +1
            h r = div (r-1) (nrows q) +1 doikjh3_.,mnbvcxz2
            k c = div (c-1) (ncols q) +1
  2. juabaerui
    import Data.Matrix
     
    kronecker :: Num t => Matrix t -> Matrix t -> Matrix t
    kronecker a b = matrix (m*p) (n*q) f
      where m = nrows a
            n = ncols a
            p = nrows b
            q = ncols b
            f (i,j) = a !(k+1,r+1) * b!(l+1,s+1)
              where (k,l) = quotRem (i-1) p
                    (r,s) = quotRem (j-1) q
  3. Enrique Zubiría
    import Data.Matrix
    import Data.List
     
    kronecker :: Num t => Matrix t -> Matrix t -> Matrix t
    kronecker a b = foldl1 (<->)
                    (map (f -> foldl1 (<|>) (take (ncols a) (drop ((ncols a)*(f-1)) (map (x -> scaleMatrix x b) (toList a))))) [1..nrows a])
  4. melgonaco
    import Data.Matrix
     
    kronecker a b = aux a b (ncols a)
      where aux a b 1 = bloqueColumna 1 a b
            aux a b n = aux a b (n-1) <|> bloqueColumna n a b
     
    bloque (i,j) a b = scaleMatrix (a!(i,j)) b
     
    bloqueColumna j a b = aux a b (nrows a)
      where aux a b 1 = bloque (1,j) a b
            aux a b n = aux a b (n-1) <-> bloque (n,j) a b

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.