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 = foldl1 (<->) [foldl1 (<|>) [scaleMatrix (a!(i,j)) b | j <- [1..ncols b]] | i <- [1..nrows a]] -- 2ª solución kronecker2 :: Num t => Matrix t -> Matrix t -> Matrix t kronecker2 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!(1 + (i-1) `div` p, 1 + (j-1) `div` q) * b!(1 + (i-1) `rem` p, 1 + (j-1) `rem` q)