Producto de Kronecker
Si es una matriz
y
es una matriz
, entonces el producto de Kronecker
es la matriz bloque
Más explícitamente, tenemos
Por ejemplo,
Definir la función
1 |
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,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
λ> 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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.»