Skip to content

Instantly share code, notes, and snippets.

@indirivacua
Created July 23, 2023 05:44
Show Gist options
  • Save indirivacua/f777471829d902b7e2337d4e897f2b29 to your computer and use it in GitHub Desktop.
Save indirivacua/f777471829d902b7e2337d4e897f2b29 to your computer and use it in GitHub Desktop.

Matemática

El producto tensorial (también conocido como producto externo) es una operación binaria que toma dos tensores (por ejemplo, vectores o matrices) y produce un nuevo tensor de mayor rango. El producto tensorial se puede aplicar en diversos contextos a vectores, matrices, tensores y espacios vectoriales. Existen casos especiales del mismo:

  • El producto de Kronecker es una operación sobre dos matrices de tamaño arbitrario que da como resultado una matriz bloque. Es un caso especial del producto tensorial cuando se aplica a matrices.
  • El producto exterior (outer product) es una operación matemática que toma dos vectores y produce una matriz. Es el caso especial del producto tensorial cuando los operandos son vectores.

Producto tensorial de dos vectores:

Supongamos que tenemos dos vectores columna u y v de dimensiones (m, 1) y (n, 1) respectivamente:

$$ u = \begin{bmatrix} u_1 \\ u_2 \\ \vdots \\ u_m \end{bmatrix}, v = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} $$

El producto tensorial de u y v se denota como u ⊗ v y se calcula como el producto matricial u * v^T. El resultado es una matriz de dimensiones (m, n) cuyos elementos son el producto de cada elemento de u por cada elemento de v:

$$ u ⊗ v = u * v^T = [u_i * v_j] = \begin{bmatrix} u_1 * v_1 & u_1 * v_2 & \cdots & u_1 * v_n \\ u_2 * v_1 & u_2 * v_2 & \cdots & u_2 * v_n \\ \vdots & \vdots & \ddots & \vdots \\ u_m * v_1 & u_m * v_2 & \cdots & u_m * v_n \end{bmatrix} $$

Por ejemplo, si tenemos los vectores columna u = [1, 2]^T y v = [3, 4, 5]^T, el producto tensorial de u y v sería:

$$ u ⊗ v = u * v^T = \begin{bmatrix} 1 \\ 2 \end{bmatrix} * \begin{bmatrix} 3 & 4 & 5 \end{bmatrix} = \begin{bmatrix} 1*3 & 1*4 & 1*5 \\ 2*3 & 2*4 & 2*5 \end{bmatrix} = \begin{bmatrix} 3 & 4 & 5 \\ 6 & 8 & 10 \end{bmatrix} $$

Producto tensorial de dos matrices cuadradas:

Supongamos que tenemos dos matrices cuadradas A y B de dimensiones (m,m) y (n,n) respectivamente:

$$ A = [a_{ij}], B = [b_{ij}] $$

El producto tensorial de A y B se denota como A ⊗ B y se calcula como una matriz de bloques donde cada elemento a_{ij} de la matriz A se reemplaza por el bloque a_{ij} * B. El resultado es una matriz de dimensiones (m*n,m*n):

$$ A ⊗ B = [a_{ij} * B] = \begin{bmatrix} a_{11}*B & a_{12}*B & \cdots & a_{1m}*B \\ a_{21}*B & a_{22}*B & \cdots & a_{2m}*B \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1}*B & a_{m2}*B & \cdots & a_{mm}*B \end{bmatrix} $$

Por ejemplo, si tenemos las matrices cuadradas A = [[1, 2], [3, 4]] y B = [[5, 6], [7, 8]], el producto tensorial de A y B sería:

$$ A ⊗ B = \begin{bmatrix} [1]*B &[2]*B\\ [3]*B &[4]*B\\ \end{bmatrix}= \begin{bmatrix} [1]*[5] &[1]*[6] &[2]*[5] &[2]*[6]\\ [1]*[7] &[1]*[8] &[2]*[7] &[2]*[8]\\ [3]*[5] &[3]*[6] &[4]*[5] &[4]*[6]\\ [3]*[7] &[3]*[8] &[4]*[7] &[4]*[8]\\ \end{bmatrix}= \begin{bmatrix} 5 &6 &10 &12\\ 7 &8 &14 &16\\ 15 &18 &20 &24\\ 21 &24 &28 &32\\ \end{bmatrix} $$

Producto tensorial de dos matrices no cuadradas:

El producto tensorial se puede calcular para cualquier par de matrices (no necesariamente cuadradas). Supongamos que tenemos dos matrices A y B de dimensiones (m,p) y (n,q) respectivamente:

$$ A = [a_{ij}], B = [b_{ij}] $$

El producto tensorial de A y B se denota como A ⊗ B y se calcula como una matriz de bloques donde cada elemento a_{ij} de la matriz A se reemplaza por el bloque a_{ij} * B. El resultado es una matriz de dimensiones (m*n,p*q):

$$ A ⊗ B = [a_{ij} * B] = \begin{bmatrix} a_{11}*B & a_{12}*B & \cdots & a_{1p}*B \\ a_{21}*B & a_{22}*B & \cdots & a_{2p}*B \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1}*B & a_{m2}*B & \cdots & a_{mp}*B \end{bmatrix} $$

Por ejemplo, si tenemos las matrices A = [[1, 2], [3, 4]] y B = [[5, 6, 7], [8, 9, 10]], el producto tensorial de A y B sería:

$$ A ⊗ B = \begin{bmatrix} [1]*B &[2]*B\\ [3]*B &[4]*B\\ \end{bmatrix}= \begin{bmatrix} [1]*[5] &[1]*[6] &[1]*[7] &[2]*[5] &[2]*[6] &[2]*[7]\\ [1]*[8] &[1]*[9] &[1]*[10]&[2]*[8] &[2]*[9] &[2]*[10]\\ [3]*[5] &[3]*[6] &[3]*[7] &[4]*[5] &[4]*[6] &[4]*[7]\\ [3]*[8] &[3]*[9] &[3]*[10]&[4]*[8] &[4]*[9] &[4]*[10]\\ \end{bmatrix}= \begin{bmatrix} 5&6&7&10&12&14\\ 8&9&10&16&18&20\\ 15&18&21&20&24&28\\ 24&27&30&32&36&40\\ \end{bmatrix} $$

Esta operación tiene varias propiedades interesantes, algunas de las cuales se enumeran a continuación:

  1. Bilinealidad: El producto tensorial es bilineal, lo que significa que satisface las siguientes propiedades para cualquier escalar α y β y cualquier tensor A, B y C del mismo tipo:

$$ (αA + βB) ⊗ C = α(A ⊗ C) + β(B ⊗ C) $$

$$ A ⊗ (αB + βC) = α(A ⊗ B) + β(A ⊗ C) $$

  1. Asociatividad con el producto escalar: El producto tensorial es asociativo con el producto escalar, lo que significa que para cualquier escalar α y cualquier tensor A y B del mismo tipo, se cumple la siguiente propiedad:

$$ (αA) ⊗ B = A ⊗ (αB) = α(A ⊗ B) $$

  1. No conmutatividad: En general, el producto tensorial no es conmutativo, lo que significa que para dos tensores A y B del mismo tipo, no siempre se cumple que A ⊗ B = B ⊗ A. Sin embargo, en algunos casos especiales (por ejemplo, cuando A y B son escalares), el producto tensorial puede ser conmutativo.

  2. Asociatividad generalizada: El producto tensorial satisface una forma generalizada de asociatividad, lo que significa que para cualquier número finito de tensores A1, A2, ..., An del mismo tipo, se cumple la siguiente propiedad:

$$ A1 ⊗ (A2 ⊗ (... ⊗ An)) = (A1 ⊗ A2) ⊗ (... ⊗ An) = ... = A1 ⊗ A2 ⊗ ... ⊗ An $$

  1. Distributividad sobre el producto de Kronecker: El producto tensorial es distributivo sobre el producto de Kronecker (también conocido como producto directo), lo que significa que para cualquier matriz A, B, C y D de dimensiones compatibles, se cumple la siguiente propiedad:

$$ (A ⊗ B)(C ⊗ D) = AC ⊗ BD $$

Estas son solo algunas de las propiedades del producto tensorial. Esta operación tiene muchas otras propiedades interesantes y aplicaciones en diferentes campos de las matemáticas y la física.

NumPy

import numpy as np

u = np.array([1, 2])
v = np.array([3, 4, 5])

w = np.outer(u,v)

print(w)

A = np.array([[2,-1,3], [1,-2,-1], [2,-2,-3]]) 
B = np.array([[3, -1], [4, -2]])

C = np.kron(A, B)

print(C)

C = np.tensordot(A,B,axes=0).reshape(6,6)

print(C)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment