{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![CC](https://i.creativecommons.org/l/by/4.0/88x31.png)\n", "\n", "This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).\n", "\n", "# Linear algebra with PyTorch\n", "\n", "This notebook introduces some frequently used linear Algebra and tensor operations in PyTorch. For a general introduction to important concepts of linear Algebra, refer to:\n", "\n", "> [Introduction to linear Algebra](https://math.mit.edu/~gs/linearalgebra/) by Gilbert Strang\n", "\n", "The first version of this notebook was created by **Mahdi Maktabi** during his time as student assisant at TU Braunschweig's [Institute of Fluid Mechanics](https://www.tu-braunschweig.de/ism)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# import PyTorch and plotting libraries\n", "import torch as pt\n", "import visualization as vis\n", "import matplotlib.pyplot as plt\n", "from math import sqrt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PyTorch tensors\n", "\n", "PyTorch provides a [tensor](https://pytorch.org/docs/stable/tensors.html) type to define $n$-dimensional arrays. Each element in a tensor must be of the same type. Working with PyTorch tensors has a very similar look and feel to working with Numpy arrays. flowTorch uses PyTorch tensors as data structure for field data.\n", "\n", "### Creating tensors" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creating a vector of length 10 initialized with zeros\n", "origin = pt.zeros(10)\n", "origin" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dimension: torch.Size([10])\n", "Datatype: torch.float32\n" ] } ], "source": [ "# the two most important tensor attributes: size and dtype\n", "print(\"Dimension: \", origin.size())\n", "print(\"Datatype: \", origin.dtype)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[1., 1.],\n", " [1., 1.],\n", " [1., 1.]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a 2D tensor with 3 rows and two columns filled with ones\n", "ones = pt.ones((3, 2))\n", "ones" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([ 0.0000, 2.5000, 5.0000, 7.5000, 10.0000])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 1D tensor with 5 linearly spaced values between zero and ten\n", "x = pt.linspace(0, 10, 5)\n", "x" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created tensor of shape torch.Size([4, 3])\n" ] }, { "data": { "text/plain": [ "tensor([[ 0, 1, 2],\n", " [ 3, 4, 5],\n", " [ 6, 7, 8],\n", " [ 9, 10, 11]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creating a tensor from a Python list\n", "X_list = [\n", " [0, 1, 2],\n", " [3, 4, 5],\n", " [6, 7, 8],\n", " [9, 10, 11]\n", "]\n", "X = pt.tensor(X_list)\n", "print(\"Created tensor of shape \", X.size())\n", "X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Accessing elements in a tensor\n", "\n", "PyTorch tensors support element access via the typical square-bracket syntax. Also slicing is supported." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(11)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# accessing the element in the fourth row and thrid column\n", "X[3, 2]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([0, 3, 6, 9])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# accessing the first column\n", "X[:, 0]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([3, 4, 5])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# accessing the second row\n", "X[1]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([1, 4])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# accessing the first two elements in the second column\n", "X[:2, 1]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([7, 8])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# accessing the last two column of the thrid row\n", "X[2, -2:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic tensor operations" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[2., 2., 2.],\n", " [2., 2., 2.]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# elementwise addition of a scalar value\n", "# X += 2 is shorthand for X = X + 2\n", "X = pt.zeros((2, 3))\n", "X += 2\n", "X" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[4., 4., 4.],\n", " [4., 4., 4.]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# elementwise multiplication with a scalar value\n", "Y = X * 2\n", "Y" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-2., -2., -2.],\n", " [-2., -2., -2.]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# elementwise subtraction of two tensors with the same shape\n", "X - Y" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[8., 8., 8.],\n", " [8., 8., 8.]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# elementwise multiplication of two tensors with the same shape\n", "X * Y" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape of 1D tensor: torch.Size([1, 3])\n" ] }, { "data": { "text/plain": [ "tensor([[3., 3., 3.],\n", " [3., 3., 3.]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subtracting a 1D tensor from each row\n", "ones = pt.ones((1, Y.size()[1]))\n", "print(\"Shape of 1D tensor: \", ones.size())\n", "Y - ones" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape of 1D tensor: torch.Size([2, 1])\n" ] }, { "data": { "text/plain": [ "tensor([[2., 2., 2.],\n", " [2., 2., 2.]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subtracting a 1D tensor from each column\n", "twos = pt.ones((Y.size()[0]), 1) * 2\n", "print(\"Shape of 1D tensor: \", twos.size())\n", "Y - twos" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape of Y/Y.T: torch.Size([2, 3]) / torch.Size([3, 2])\n" ] }, { "data": { "text/plain": [ "tensor([[4., 4.],\n", " [4., 4.],\n", " [4., 4.]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# transpose (swapping rows and columns in 2D)\n", "print(\"Shape of Y/Y.T: \", Y.size(), \"/\", Y.T.size())\n", "Y.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear algebra with PyTorch\n", "### Scalar product\n", "\n", "The scalar or dot product between two vectors $\\mathbf{a}$ and $\\mathbf{b}$ of length $N$ is defined as:\n", "\n", "$$\n", " \\langle \\mathbf{a}, \\mathbf{b} \\rangle := \\sum\\limits_{i=1}^{N} a_i b_i.\n", "$$\n", "The dot product has couple of useful properties; see section 1.2 in [Introduction to linear algebra](https://math.mit.edu/~gs/linearalgebra/).\n", "\n", "The dot product of a vector with itself is equal to the squared length/magnitude\n", "$\\langle \\mathbf{a}, \\mathbf{a} \\rangle = \\left\\|\\mathbf{a}\\right\\|^2$\n", "\n", "Example:\n", "\n", "$\\mathbf{a} = [1, 2, 2]^T$, $\\langle \\mathbf{a}, \\mathbf{a} \\rangle = 1^2 + 2^2 + 2^2 = 9$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(9.)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = pt.tensor([1.0, 2.0, 2.0])\n", "len_a = pt.norm(a)\n", "\n", "assert pt.dot(a, a) == len_a**2\n", "pt.dot(a, a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cosine of the angle enclosed by two vectors of unit length is equal to their dot-product: \n", "$$\n", " {\\displaystyle \\varphi =\\arccos{\\frac {\\langle \\mathbf{a} ,{\\mathbf {b}\\rangle}}{\\left\\|{\\mathbf {a}}\\right\\|\\left\\|{\\mathbf {b}}\\right\\|}}}\n", "$$\n", "\n", "Example:\n", "\n", "$\\mathbf {a} = [1,1,1]^T,\\ \\mathbf {b} = [4,2,2]^T$\n", "\n", "$\\left\\|{\\mathbf {a}}\\right\\| = {\\sqrt {{{1}^2}+{{1}^2}+{{1}^2}}} = 1.7321$,\n", "\n", "$\\left\\|{\\mathbf {b}}\\right\\| = {\\sqrt {{{4}^2}+{{2}^2}+{{2}^2}}} = 4.8990$,\n", "\n", "$\\langle \\mathbf{a}, \\mathbf{b} \\rangle = 1\\cdot 4+1\\cdot 2+1\\cdot 2 = 8$\n", "\n", "${\\displaystyle \\varphi =\\arccos {\\frac {8}{1.7321\\cdot 4.8990}=0.3398}}$" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(0.3398)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = pt.tensor([1.0, 1.0, 1.0])\n", "b = pt.tensor([4.0, 2.0, 2.0])\n", "c = pt.dot(a, b)/(pt.norm(a)*pt.norm(b)) \n", "angle = pt.acos(c) # angle in radians\n", "\n", "assert pt.isclose(angle, pt.tensor(0.3398), atol=1.0E-3)\n", "angle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To find a unit vector with the same direction as a given vector, we divide by the vector's magnitude:\n", "\n", "$$ {\\displaystyle \\mathbf{u} = {\\frac { \\mathbf{a} }{\\left\\|{\\mathbf {a}}\\right\\|}}}$$\n", "\n", "Example:\n", "\n", "$\\mathbf{a} = [3,6,1]^T$, $\\left\\|{\\mathbf{a}}\\right\\| = \\sqrt {46}$\n", "\n", "$\\left\\|{\\mathbf {u}}\\right\\|$ = ${\\sqrt {(\\frac {3}{\\sqrt {46}})^{2}+(\\frac {6}{\\sqrt {46} })^{2}+(\\frac {1}{\\sqrt {46} })^{2}}}=1$" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(1.0000)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# using the div-function is equivalent to elementwise division of a tensor by a scalar in this example\n", "# e.g., b = a / pt.norm(a) yields the same result\n", "a = pt.tensor([3.0, 6.0, 1.0])\n", "b = pt.div(a, pt.norm(a))\n", "a_length = pt.norm(b)\n", "\n", "assert pt.isclose(a_length, pt.tensor(1.0), atol=1.0E-3)\n", "a_length" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Two vectors are orthogonal if their dot product is zero.\n", "\n", "Example:\n", "\n", "$\\mathbf{a}=[3, 0]^T$, $\\mathbf{b}=[0, 2]^T$\n", "\n", "${\\displaystyle \\varphi =\\arccos {\\frac {{3\\cdot 0 + 0\\cdot 2}}{\\sqrt {2}\\cdot{\\sqrt {3}}}=90^{\\circ} }}$" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(90.)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = pt.tensor([3.0, 0.0])\n", "b = pt.tensor([0.0, 2.0])\n", "c = pt.dot(a, b)/(pt.norm(a)*pt.norm(b)) \n", "d = pt.acos(c)\n", "angle = pt.rad2deg(d)\n", "\n", "assert pt.isclose(angle, pt.tensor(90.), atol=1.0E-4)\n", "angle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cross product\n", "\n", "The cross product between two three-dimensional vectors $\\mathbf{a}$ and $\\mathbf{b}$ is defined as:\n", "$$\n", "\\mathbf{a}\\times\\mathbf{b} = \\sum\\limits_{i,j,k=1}^{3} a_i b_j \\epsilon_{ijk} \\mathbf{e}_k,\n", "$$\n", "\n", "where $\\epsilon_{ijk}$ is the [Levi-Civita symbol](https://en.wikipedia.org/wiki/Levi-Civita_symbol), and $\\mathbf{e}_k$ is the $k$-th unit vector.\n", "\n", "Example:\n", "\n", "$\\mathbf{a}=[1, 2, 3]^T$, $\\mathbf{b}=[3, 2, 1]^T$\n", "\n", "${\\mathbf{a}}\\times{\\mathbf{b}}=\\begin{bmatrix}1 \\\\ 2 \\\\ 3 \\end{bmatrix}\\times\\begin{bmatrix}3 \\\\ 2 \\\\ 1 \\end{bmatrix}=\\begin{bmatrix}2\\cdot1 - 3\\cdot2 \\\\3\\cdot3 - 1\\cdot1 \\\\1\\cdot2 - 2\\cdot3\\end{bmatrix}\\,=\\begin{bmatrix}-4 \\\\ 8 \\\\ -4\\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([-4., 8., -4.])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = pt.tensor([1.0, 2.0, 3.0])\n", "b = pt.tensor([3.0, 2.0, 1.0])\n", "c = pt.cross(a, b)\n", "\n", "assert pt.equal(c, pt.tensor([-4., 8., -4.]))\n", "c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cross product may be used to compute the angle between two vectors:\n", "\n", "$${\\displaystyle \\varphi =\\arcsin {\\frac {\\left\\| \\mathbf{a} \\times \\mathbf {b}\\right\\|}{ \\left\\|{\\mathbf {a}}\\right\\| \\left\\|{\\mathbf {b}}\\right\\|}}}$$\n", "\n", "Example:\n", "\n", "$\\mathbf {a} = [1,-2,3]^T,\\mathbf{b} = [-4,5,6]^T$\n", "\n", "$\\left\\|{\\mathbf {a}}\\right\\|= {\\sqrt {{{1}^2}+{{-2}^2}+{{3}^2}}} = \\sqrt {14}$,\n", "$\\left\\|{\\mathbf {b}}\\right\\|= {\\sqrt {{{-4}^2}+{{5}^2}+{{6}^2}}} = \\sqrt {77}$\n", "\n", "${\\displaystyle \\left\\|\\mathbf {a\\times b}\\right\\| ={\\begin{vmatrix} \\mathbf i& \\mathbf j& \\mathbf k \\\\1&-2&3\\\\-4&5&6\\\\\\end{vmatrix}}}$\n", "${\\displaystyle {\\begin{aligned} =(-27)\\mathbf {i} -(18)\\mathbf {j} +(-3)\\mathbf {k}={\\sqrt {{{(-27)}^2}+{{(-18)}^2}+{{(-3)}^2}}=3{\\sqrt{118}}}\\end{aligned}}}$\n", "\n", "${ \\varphi =\\arccos {\\frac {3\\sqrt{118}}{\\sqrt {14}\\sqrt {77}}=83.0023^\\circ}}$" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(83.0023)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = pt.tensor([1.0, -2.0, 3.0])\n", "b = pt.tensor([-4.0, 5.0, 6.0])\n", "c = pt.norm(pt.cross(a, b))/(pt.norm(a)*pt.norm(b)) \n", "angle = pt.rad2deg(pt.asin(c))\n", "\n", "assert pt.isclose(angle, pt.tensor(83.0023), atol=1.0E-4)\n", "angle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The magnitude of the cross product yields the area of the parallelogram spanned by two vectors $\\mathbf {a}$ and $\\mathbf {b}$.\n", "\n", "$$ A = {\\displaystyle \\left\\|\\mathbf {a} \\times \\mathbf {b} \\right\\|=\\left\\|\\mathbf {a} \\right\\|\\left\\|\\mathbf {b} \\right\\| \\sin \\varphi .}$$\n", "\n", "Example:\n", "\n", "$\\mathbf {a} = [1,1,1]^T$, $\\mathbf {b} = [1,1,2]^T$\n", "\n", "$\\mathbf{c}=\\mathbf{a}\\times\\mathbf{b} = [1, -1, 0]^T$, $\\left\\|\\mathbf{c}\\right\\|=\\sqrt{2}$" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(1.4142)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = pt.tensor([1.0, 1.0, 1.0])\n", "b = pt.tensor([1.0, 1.0, 2.0])\n", "c_mag = pt.norm(pt.cross(a, b))\n", "\n", "assert pt.isclose(c_mag, pt.tensor(1.4142), atol=1.0E-4)\n", "c_mag" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Outer product\n", "\n", "The outer product of two vectors is a matrix. If the two vectors have dimensions $m$ and $n$, their outer product is an $m\\times n$ matrix. Consider the vectors $\\mathbf{a}=[a_{1},a_{2},\\dots ,a_{m}]^T$ and $\\mathbf{b} =[b_{1},b_{2},\\dots ,b_{n}]^T$. Their outer product, denoted by $\\mathbf{a}\\otimes \\mathbf{b}$, is obtained by multiplying each element of $\\mathbf{a}$ with each element of $\\mathbf{b}$ as follows:\n", "\n", "$$\n", "\\mathbf{C} = \\mathbf {a} \\otimes \\mathbf {b} ={\\begin{bmatrix}a_{1}b_{1}&a_{1}b_{2}&\\dots &a_{1}b_{n}\\\\a_{2}b_{1}&a_{2}b_{2}&\\dots &a_{2}b_{n}\\\\\\vdots &\\vdots &\\ddots &\\vdots \\\\a_{m}b_{1}&a_{m}b_{2}&\\dots &a_{m}b_{n}\\end{bmatrix}}\n", "$$\n", "Example:\n", "\n", "$\\begin{bmatrix}0 \\\\ 1 \\\\ 2 \\end{bmatrix}\\begin{bmatrix}1&2&3 \\end{bmatrix}=\\begin{bmatrix}0&0&0\\\\1&2&3 \\\\2&4&6\\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "a = pt.tensor([[0, 1, 2]]).view(3, 1)\n", "b = pt.tensor([1, 2, 3]).view(1, 3)\n", "C = pt.mm(a, b)\n", "\n", "assert pt.equal(C, pt.tensor([[0, 0, 0],[1, 2, 3],[2, 4, 6]]))\n", "vis.plot_matrices_as_heatmap([a, b, C], [r\"$a$\", r\"$b$\", r\"$C$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Matrix multiplication" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The product of two matrices $\\mathbf{C} = \\mathbf{AB}$ creates a new matrix with the same number of rows as $\\mathbf{A}$ and the same number of columns as $\\mathbf{B}$. The number of columns of matrix $\\mathbf{A}$ must be equal to the number of row of matrix $\\mathbf{B}$.\n", "\n", "$$\n", "{\\begin{bmatrix}c_{11}&c_{12}&\\cdots &c_{1p}\\\\c_{21}&c_{22}&\\cdots &c_{2p}\\\\\\vdots &\\vdots &\\ddots &\\vdots \\\\c_{m1}&c_{m2}&\\cdots &c_{mp}\\\\\\end{bmatrix}}= {\\begin{bmatrix}a_{11}&a_{12}&\\cdots &a_{1n}\\\\a_{21}&a_{22}&\\cdots &a_{2n}\\\\\\vdots &\\vdots &\\ddots &\\vdots \\\\a_{m1}&a_{m2}&\\cdots &a_{mn}\\\\\\end{bmatrix}}{\\begin{bmatrix}b_{11}&b_{12}&\\cdots &b_{1p}\\\\b_{21}&b_{22}&\\cdots &b_{2p}\\\\\\vdots &\\vdots &\\ddots &\\vdots \\\\b_{n1}&b_{n2}&\\cdots &b_{np}\\\\\\end{bmatrix}}\n", "$$\n", "The coeffients of the resulting matrix are computed as follows:\n", "$$\n", "c_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+\\cdots +a_{ik}b_{kj}=\\sum _{k=1}^{n}a_{ik}b_{kj}\n", "$$\n", "\n", "Example:\n", "\n", "$$\n", "{\\mathbf{A}}{\\mathbf{B}}=\\begin{bmatrix}0&1&2 \\\\ 3&4&5 \\\\ 6&7&8 \\end{bmatrix}\\begin{bmatrix}0&1&2 \\\\ 3&4&5 \\\\ 6&7&8 \\end{bmatrix}=\\begin{bmatrix}15&18&21\\\\42&54&66 \\\\69&90&111 \\end{bmatrix}\n", "$$" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[0, 1, 2],\n", " [3, 4, 5],\n", " [6, 7, 8]]\n", ")\n", "B = pt.tensor(\n", " [[0, 1, 2],\n", " [3, 4, 5],\n", " [6, 7, 8]]\n", ")\n", "C = pt.mm(A, B)\n", "\n", "assert pt.equal(C, pt.tensor([[15, 18, 21],[42, 54, 66],[69, 90, 111]]))\n", "vis.plot_matrices_as_heatmap([A, B, C], [r\"$A$\", r\"$B$\", r\"$C$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Example 2:\n", "\n", "${\\mathbf{A}}{\\mathbf{B}}=\\begin{bmatrix}0&1&2 \\\\ 3&4&5 \\\\ 6&7&8 \\end{bmatrix}\\begin{bmatrix}0 \\\\ 3 \\\\ 6 \\end{bmatrix}=\\begin{bmatrix}15\\\\14\\\\23 \\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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v5wBGSmccsw4IiI8jBuVwYzDx/Lqu0vad2MkLDTOyZ7yeDxERkcSGeVcgRUVHUlkdCTGGIZOGMSwiYOJiIzA4/Ww31H7cup1M/j4xc+aXV5LNdOaunMrY60Ndx/anTEmMyMjI2OamUFeVn7I13/RHWdz/OVHEpcUy+rFa3nw6ifYsGwTaf1SeWL537jl+LtZ9tkqABK7J3D1gz/jgBkTAfhy7jdNnvMy/YwDuejOc+g9MI1tG3KdZ8W8+lXItic1I4UXNj8KwPlH/om87OKQrfuokydw/V2nN5k+65In2JqZz79ev5bbrpjD8m+dC0YTkmK56tYTmDxtBABfffpjk+eoTTt6DBdefSS9+iSTvaWQpx54n88/CO1z1FJ7JfHsB7MAOOXyR8jNLw3Zuj9/5QZqa+uorqlrNP2Gu1/h+5VO8Hr/2Wu579H3eW/BSmDnc9SOPHgkkRFelqzI5L5H32/yHLVrdzxHraic5/63iNfmLQnZdqWlJLD4nbvIysrK8h8p6PSMMZnRxGZMMzNCvu7ONs7tsMC+RRUVqqEgO/qiQ7nxyauaTL/+sNuJS4zl8j+eT1q/VOpq68jemMvcR95j7qPv17e77uHL6dk/jVtn/KF+Wks105q6aw9trSEFNdlj4QxqnVU4g1pnpaAmwaCgJm3V1hrSqU8RERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXEpBTURERERl1JQExEREXGpiHB3IJRSeieHuwudQsP3MSU1IXwd6UQavo89useHsSedR1d9Hz1eD6npKeHuRqfh2eqBunD3IrRUQ8HV1hoy1trg9caljDGZGRkZGZmZmeHuioiEUN++fcnKysqy1vYNd19CQWNd8KmGpK3aWkM69SkiIiLiUl3q1Oc5f3ue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sNZ+uqORtfZF4GVgRhDWKSISahrrpC1UP7JXghHU+gPLGvy83P99UYC2XwIDg7BOEZFQ01gnbaH6kb0SjKBWDUQ2+LnK/70kQNuyIK1TRCTUNNZJW6h+ZK8EoxC2AA3vUCkBLmHnp4WGBgK5QViniEioaayTtlD9yF5p812fwLfAlB0/WGurgaebaXu0v72ISEejsU7aQvUjeyUYQe0WoFdLjYwxPXHOz78chHWKiISaxjppC9WP7JU2BzVr7WZgcyva5eAc5hUR6XA01klbqH5kb+liRRERERGXUlATERERcSkFNRERERGXUlATERERcSkFNRERERGXUlATERERcSkFNRERERGXUlATERERcSkFNRERERGXUlATERERcalg/K3PDiM1MT7cXegUGr6PaXF6T4Oh4fuYFpMQxp50HmkxCawJdyfCwOsx9E5QDQXLFo+hLtydCDHVUHC1tYaMtTZonXErY0xmRkZGRmZmZri7IiIh1LdvX7KysrKstX3D3ZdQ0FgXfKohaau21pBOfYqIiIi4VJc69Xn7sjspqikKdzc6vG6R3bhj7O8A+HjzTCrr8sLco44vxpvKYf2eA8CXdxr4csPco07AkxbuHoSHLxdfzrRw96Lz6Ir7omoouNpYQ10qqBXVFFFQUxDubnQqlXV5VNTlhLsbnYsvF3zbwt0L6bDqVD9B1dWuUAPVULC1rYZ06lNERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQU1ERETEpRTURERERFxKQS0Ecn/I4b0r3+H5w57hhSOe453L5mJ9NmDbquIqFvzuE144/FleOOI5FvzuE6pLqhq12fjhBv531qs8N30Or5/9Khs/3hCCrXCH645dxcx9l9Z/nTv2e04fuoSv3isM2L60qJa//2YjF4xfygUT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vvrzl7x22ssA9D24HwfceGD98tL26cnBs6fx7UPf8OlvPyEhPYGDZ09vcoNBZ/b1B0WUFNRyxJmNd9rcLdX86thV3PrEYEZPcn5BXPvn/jx+RyZXHb4CgP0O78blszPqXzN8QjzX/nkAz/55K3/71UbS+kZx7V8GMHSXGww6u9eeSmfWndsZPmUjlVU++vWJ5P670jhyehwLvqxgxswtLPukP/37RuLxGF5/Op2rbs4lY9x6oqMN55ySyJ9+uzPcnnliAjm5tVx4dTY52+sYNTSKN5/pQ7+MrnWKvqu49vJkyit8nHzRVgqL6hg2KIoXHunFARNj2JRZw9hDNvHWc32YdqBzpHrOg7245tZchk1xLgGZcWQc/7hn5xh24H4xPP1gL279w3ZmXpnNwL4RzHmwV5OLxaXj2l3N1NRYrr0ll1VrqvH5YP9x0bz5TDoHTd55puOe+/N5/tVSfvikP+B8AJj7XDrX357HDbPz6JXq5e6be3DajJ0fFv4yO5XrZ+ex39GbqaqyTJ8Sy+tPp+/2A78bmF3vrOiMjDGZGRkZGWe8eTYFNQXh7k6H1z2yO3+f8BcA3tlwDBV1OS28QloS6+3JcQPnAeDLmQa+sJyt71w8vek/cT1ZWVlZ/lM6nZ4xJjMj3Zux6dtB4e5Kp9F/4nqyttaphmSvtbWGdOpTRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcSkFNRERExKUU1ERERERcKiLcHQilbpHdwt2FTqHh+xjjTQ1jTzqPRu+jJy18HelMPGnA+nD3Igy84Okd7k50IpuAunB3IsRUQ8HVthoy1trg9cWljDHVHo8nMj09PdxdEZEQ2rp1Kz6fr8ZaGxXuvoSCxrrgUw1JW7W1hrpKUCsDIoGccPel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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[0., 1., 2.],\n", " [3., 4., 5.],\n", " [6., 7., 8.]]\n", ")\n", "B = pt.tensor([[0., 3., 6.]]).view(3, 1)\n", "C = pt.mm(A, B)\n", "\n", "# instead of the mm function we can also use the @ opertaor\n", "assert pt.equal(C, A @ B)\n", "assert pt.equal(C, pt.tensor([15., 42., 69.]).view(3, 1))\n", "vis.plot_matrices_as_heatmap([A, B, C], [r\"$A$\", r\"$B$\", r\"$C$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Identity matrix\n", "\n", "The identity matrix is a square matrix with a value of one on the diagonal and zero elsewhere.\n", "\n", "$$\n", "I={\\begin{bmatrix}1&0&0&\\cdots &0\\\\0&1&0&\\cdots &0\\\\0&0&1&\\cdots &0\\\\\\vdots &\\vdots &\\vdots &\\ddots &\\vdots \\\\0&0&0&\\cdots &1\\end{bmatrix}}\n", "$$" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ones = pt.ones(3)\n", "identity = pt.diag(ones)\n", "\n", "assert pt.allclose(pt.eye(3), identity)\n", "vis.plot_matrices_as_heatmap([identity], [r\"$I$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Transpose of a matrix\n", "\n", "The transpose of a matrix is obtained by swaping its rows and columns.\n", "\n", "$$\n", "\\mathbf{A}=\n", "\\begin{bmatrix}\n", "a_{11} & \\dots & a_{1n} \\\\\n", "\\vdots & & \\vdots \\\\\n", "a_{m1} & \\dots & a_{mn}\n", "\\end{bmatrix},\\quad\n", "\\mathbf{A}^T=\n", "\\begin{bmatrix}\n", "a_{11} & \\dots & a_{m1} \\\\\n", "\\vdots & & \\vdots \\\\\n", "a_{1n} & \\dots & a_{mn}\n", "\\end{bmatrix}\n", "$$\n", "\n", "Example:\n", "\n", "$\\begin{bmatrix}1&3&5\\\\2&4&6\\end{bmatrix}^T=\\begin{bmatrix}1&2\\\\3&4\\\\5&6\\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[1, 3, 5],\n", " [2, 4, 6]]\n", ")\n", "AT = pt.tensor(\n", " [[1, 2],\n", " [3, 4],\n", " [5, 6]]\n", ")\n", "\n", "assert (A.T - AT).sum().item() == 0\n", "vis.plot_matrices_as_heatmap([A, A.T], [r\"$A$\", r\"$A^T$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Symmetric matrix\n", "\n", "A symmetric matrix is a square matrix that is equal to its transpose: $\\mathbf{A} = \\mathbf{A}^T$. The matrix coefficients are symmetric with respect to the diagonal.\n", "\n", "Example:\n", "\n", "${\\begin{bmatrix}1&2&6\\\\2&3&4\\\\6&4&5\\end{bmatrix}}$" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[1, 2, 6],\n", " [2, 3, 4],\n", " [6, 4, 5]]\n", ")\n", "AT = pt.transpose(A, 0, 1)\n", "\n", "assert pt.equal(A, AT)\n", "vis.plot_matrices_as_heatmap([A], [r\"$A$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Orthogonal matrix\n", "\n", "A matrix is orthogonal if its column vectors form an orthogonal basis. The column vectors are orthogonal if:\n", "\n", "$$\n", "\\langle\\mathbf{q}_i, \\mathbf{q}_j\\rangle=\n", "\\begin{cases}\n", " 0 & \\text{if} ~i\\neq j \\\\\n", " \\neq 0 & \\text{if}~i=j\n", "\\end{cases}\n", "$$\n", "\n", "Example:\n", "\n", "${\\mathbf{Q}}{\\mathbf{Q^{T}}}=\\begin{bmatrix}1&-2&2 \\\\ 2&-1&-2 \\\\ 2&2&1 \\end{bmatrix}\\begin{bmatrix} 1&2&2 \\\\ -2&-1&2 \\\\ 2&-2&1 \\end{bmatrix}=\\begin{bmatrix}9&0&0\\\\0&9&0 \\\\0&0&9 \\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Q = pt.tensor(\n", " [[1.0, -2.0, 2.0],\n", " [2.0, -1.0, -2.0],\n", " [2.0, 2.0, 1.0]]\n", ")\n", "QT = pt.transpose(Q, 0, 1)\n", "O = pt.mm(Q, QT)\n", "\n", "assert pt.allclose(pt.eye(3)*9, O)\n", "vis.plot_matrices_as_heatmap([Q, QT, O], [r\"$Q$\", r\"$Q^T$\", r\"$O$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Orthonormal matrix\n", "\n", "The vectors $\\mathbf{q}_i$ are orthonormal if:\n", "\n", "$$\n", "\\langle\\mathbf{q}_i, \\mathbf{q}_j\\rangle={\\begin{cases}0&{\\text{if}}~i\\neq j\\quad\\text{(orthogonal vectors)} \\\\1&{\\text{if}~i=j\\quad\\text{(unit vectors: $|\\mathbf{q}_i|$ = 1)}}\\end{cases}}\n", "$$\n", "\n", "A matrix $\\mathbf{Q}$ with orthonormal column vectors satisfies the relation $\\mathbf{Q}^T\\mathbf{Q} = \\mathbf{Q}\\mathbf{Q}^T = \\mathbf{I}$.\n", "\n", "Example:\n", "\n", "${\\mathbf{Q}^T}{\\mathbf{Q}}=\\begin{bmatrix}{\\frac {1}{\\sqrt{2}}}&{\\frac {1}{\\sqrt{6}}}&{\\frac {1}{\\sqrt{3}}}\\\\{\\frac {-1}{\\sqrt{2}}}&{\\frac {1}{\\sqrt{6}}}&{\\frac {1}{\\sqrt{3}}}\\\\0&{\\frac {-2}{\\sqrt{6}}}&{\\frac {1}{\\sqrt{3}}}\\end{bmatrix}\\begin{bmatrix}{\\frac {1}{\\sqrt{2}}}&{\\frac {-1}{\\sqrt{2}}}&0\\\\{\\frac {1}{\\sqrt{6}}}&{\\frac {1}{\\sqrt{6}}}&{\\frac {-2}{\\sqrt{6}}}\\\\{\\frac {1}{\\sqrt{3}}}&{\\frac {1}{\\sqrt{3}}}&{\\frac {1}{\\sqrt{3}}}\\end{bmatrix}=\\begin{bmatrix}1&0&0\\\\0&1&0 \\\\0&0&1 \\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Q = pt.tensor(\n", " [[1./sqrt(2), 1./sqrt(6), 1./sqrt(3)],\n", " [-1./sqrt(2), 1./sqrt(6), 1./sqrt(3)],\n", " [0./sqrt(2), -2./sqrt(6), 1./sqrt(3)]]\n", ")\n", "QT = pt.transpose(Q, 0, 1)\n", "I = pt.mm(QT, Q)\n", "\n", "assert pt.allclose(pt.eye(3), I, atol=1.0E-6)\n", "assert pt.allclose(pt.mm(Q, QT), pt.mm(QT, Q), atol=1.0E-6)\n", "vis.plot_matrices_as_heatmap([Q, QT, I], [r\"$Q$\", r\"$Q^T$\", r\"$I$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Hermitian matrix\n", "\n", "A Hermitian matrix is a complex matrix that is equal to its conjugate transpose:\n", "\n", "$$ \\mathbf{A}=\\overline{\\mathbf{A}}^T $$\n", "\n", "Example:\n", "\n", "${\\mathbf{A} = \\begin{bmatrix}1&3-{\\mathrm {j}}&4\\\\3+{\\mathrm {j}}&-2&-6+{\\mathrm {j}}\\\\4&-6-{\\mathrm {j}}&5\\end{bmatrix},} \\quad {\\overline{\\mathbf{A}} = \\begin{bmatrix}1&3+{\\mathrm {j}}&4\\\\3-{\\mathrm {j}}&-2&-6-{\\mathrm {j}}\\\\4&-6+{\\mathrm {j}}&5\\end{bmatrix}}$\n", "\n", "${\\mathbf{A}=\\overline{\\mathbf{A}}^T= \\begin{bmatrix}1&3-{\\mathrm {j}}&4\\\\3+{\\mathrm {j}}&-2&-6+{\\mathrm {j}}\\\\4&-6-{\\mathrm {j}}&5\\end{bmatrix}}$" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[1., 3.-1j , 4.],\n", " [3.+1j, -2., -6.+1j],\n", " [4., -6.-1j, 5.]]\n", ")\n", "AH = A.conj().T\n", "\n", "assert pt.allclose(A, AH)\n", "vis.plot_matrices_as_heatmap([A.real, A.imag], [r\"$Re(A)$\", r\"$Im(A)$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Unitary matrix\n", "\n", "A unitary matrix is a complex square matrix whose column vectors form an orthonormal basis. The matrix product of a unitary matrix with its conjugate transpose, denoted by $\\dagger$, yields the identity matrix:\n", "\n", "$$ \\mathbf{Q}\\mathbf{Q}^\\dagger = \\mathbf{I} $$\n", "\n", "Example:\n", "\n", "${\\mathbf{Q}={\\frac {1}{2}}\\begin{bmatrix}1+i&1-i\\\\1-i&1+i\\end{bmatrix}},\\quad\n", "{\\mathbf{Q}\\mathbf{Q}^\\dagger={\\frac {1}{4}}\\begin{bmatrix}1+i&1-i\\\\1-i&1+i\\end{bmatrix}}{\\begin{bmatrix}1-i&1+i\\\\1+i&1-i\\end{bmatrix}}=\\begin{bmatrix}1&0\\\\0&1 \\end{bmatrix}= \\mathbf{I}$" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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cmcLo5Z1jlxERMRjCnIRERGPKchFREQ8piAXERHxmIJcRETEYwpyERERjynIRUREPKYgFxER8ZiCXERExGMKchEREY8pyEVERDymIBcREfGYglxERMRjCnIRERGPKchFREQ8piAXERHxmIJcRETEYwpyERERjynIRUREPKYgFxER8ZiCXERExGMKchEREY8pyEVERDymIBcREfGYglxERMRjCnIRERGPKchFREQ8piAXERHxmIJcRETEYwpyERERjynIRUREPKYgFxER8ZiCXERExGMKchEREY8pyEVERDymIBcREfGYglxERMRjCnIRERGPZXb3AvQWD/ythjvuruKNtxqo2eNo2DKGzEzbZ//dlVEuv2YXC5+twwzOODmX238+gKLCjESfBx/fw3U3V7CprJmRQzP56dwSvnBmv65YHS/Muv6LnPGNk8ktzGXt6+uZ9+272Lh6S8q+/YrymDPvEqbNmIxzjkULlzFvzl3UVtUl+kw/bxoX//TLDBwxgB0bd3L3tffz8iOLu2p1JE0451jPW5SxgWaaKKCYI5hIPytM2b/JNfIuy9nFNgyjlEEczkSyLDvRZ4fbyjpWU08tfchjLEdxiA3pqlVKW9rWHaM98i5SXBjhWxcX8qsbB3So/0VzdrCzPMraV0ew5pUR7CyPcvEVOxPTFy2rZ9acHfx0bgmVa0Zz4w9KuGjODpauqO+sVfDKBVedxalfO4m5p93E+QMuYfUr7/LzJ6+lT16flP3n3vsdigcWMmvsHL467nKKBxby/XvmJKYfMXUsc++9nLuvvZ+zC2dx948fYO59V3DY5NFdtUqSJjaxhvfZyCSmcwJnUUQJy3mJZtecsv8qFtNIA8dzOsdxGo00sJolielVroLVLGYM4zmRcxjDeFaxiGr3QVetUtrStu4YBXkXOfWkPC48N5/RIw58EGTTliaeeK6OW39SSmlJBqUlGdz6k1Iee6qWzVubAJi/oIrTTsrlvBn9yMoyzpvRj1NPzOXOBVWdvSpe+Pylp/LgbY+xcdVmGusbuefHD5CZnclnzp3aru8hw0v51JmTmH/VAqoraqiuqGH+VQs47uwpDBhWCsCM2aew+IkVvPzwIqLNUV5+eBFLnlzBjEtP7epVk262lXWM4DD6WSEZlsFoxhMjxi7K2vX90NVSwXbGcQzZlkO25TCOYyhnG/WuLj6/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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Q = pt.tensor(\n", " [[(1+1j)/2.0, (1-1j)/2.0],\n", " [(1-1j)/2.0, (1+1j)/2.0]]\n", ")\n", "QH = pt.conj(Q).T\n", "I = pt.mm(Q, QH)\n", "\n", "assert pt.allclose(I, pt.eye(2, dtype=pt.cfloat))\n", "assert pt.allclose(I, pt.mm(QH, Q))\n", "vis.plot_matrices_as_heatmap([I.real, I.imag], [r\"$Re(I)$\", r\"$Im(I)$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix decompositions\n", "\n", "### Eigen-decomposition\n", "\n", "The eigen-decomposition of a square matrix $\\mathbf{A}$ is:\n", "\n", "$$ \\mathbf{A}=\\mathbf{Q}\\mathbf{\\Lambda}\\mathbf{Q}^{-1} $$\n", "\n", "$\\mathbf{Q}$ is a square matrix formed by the eigenvecctors of $\\mathbf{A}$, and $\\mathbf{\\Lambda}$ is a diagonal matrix whose diagonal elements are the corresponding eigenvalues." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[0.0, 0.0, 2.0],\n", " [1.0, 0.0, -5.0],\n", " [0.0, 1.0, 4.0]]\n", ")\n", "\n", "# the eigen decomposition returns complex tensors; to compare them with\n", "# the original tensor, we remove the imaginary part\n", "val, vec = pt.linalg.eig(A)\n", "Q = vec.real\n", "L = pt.diag(val).real\n", "invQ = pt.linalg.inv(Q)\n", "\n", "assert pt.allclose(pt.mm(Q, invQ), pt.eye(3), atol=1.0E-3)\n", "assert pt.allclose(A, pt.mm(Q, L).mm(invQ), atol=1.0E-2)\n", "vis.plot_matrices_as_heatmap([Q, L, invQ], [r\"$Q$\", r\"$\\Lambda$\", r\"$Q^{-1}$\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Singular value decomposition (SVD)\n", "\n", "The SVD is a factorization of a real or complex matrix that generalizes the eigen-decomposition of a square matrix to any ${ m\\times n}$ matrix:\n", "\n", "$$\\mathbf{A} = \\mathbf{U}\\mathbf{\\Sigma}\\mathbf{V}^\\dagger$$\n", "\n", "- $\\mathbf{U}$: is a $m \\times m$ unitary matrix; the columns of $\\mathbf{U}$ are called left singular vectors\n", "- $\\mathbf{\\Sigma}$ is a $m\\times n$ matrix containing a diagonal matrix of dimension $\\mathrm{min}(m, n)$; the diagonal elements are called singular values\n", "- $\\mathbf{V}^\\dagger$ is a $n\\times n$ unitary matrix; the columns of $\\mathbf{V}^\\dagger$ are called right singular vectors\n", "\n", "example:\n", "\n", "$\\mathbf{A}$=$\\begin{bmatrix}1&2 \\\\ 3&4 \\\\ 5&6 \\end{bmatrix}$=$\\begin{bmatrix}-0.23&0.88&0.41\\\\-0.52&0.24&-0.82\\\\-0.82&-0.4&0.41 \\end{bmatrix}\\begin{bmatrix}9.53&0\\\\0&0.51\\\\0&0 \\end{bmatrix}\\begin{bmatrix}-0.62&-0.78\\\\-0.78&0.62 \\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A = pt.tensor(\n", " [[1.0, 2.0],\n", " [3.0, 4.0],\n", " [5.0, 6.0]]\n", ")\n", "U, s, VH = pt.svd(A, some=False, compute_uv=True)\n", "S = pt.zeros_like(A)\n", "S[:A.shape[1], :] = pt.diag(s)\n", "\n", "assert pt.allclose(U.mm(U.conj().T), pt.eye(3), atol=1.0e-6)\n", "assert pt.allclose(VH.mm(VH.conj().T), pt.eye(2), atol=1.0e-6)\n", "assert pt.allclose(A, U.mm(S.mm(VH)))\n", "vis.plot_matrices_as_heatmap([U, S, VH], [r\"$U$\", r\"$\\Sigma$\", r\"$V^H$\"])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 }