{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Math - Linear Algebra**\n", "\n", "*Linear Algebra is the branch of mathematics that studies [vector spaces](https://en.wikipedia.org/wiki/Vector_space) and linear transformations between vector spaces, such as rotating a shape, scaling it up or down, translating it (ie. moving it), etc.*\n", "\n", "*Machine Learning relies heavily on Linear Algebra, so it is essential to understand what vectors and matrices are, what operations you can perform with them, and how they can be useful.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", "
\n", " \"Open\n", " \n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Vectors\n", "## Definition\n", "A vector is a quantity defined by a magnitude and a direction. For example, a rocket's velocity is a 3-dimensional vector: its magnitude is the speed of the rocket, and its direction is (hopefully) up. A vector can be represented by an array of numbers called *scalars*. Each scalar corresponds to the magnitude of the vector with regards to each dimension.\n", "\n", "For example, say the rocket is going up at a slight angle: it has a vertical speed of 5,000 m/s, and also a slight speed towards the East at 10 m/s, and a slight speed towards the North at 50 m/s. The rocket's velocity may be represented by the following vector:\n", "\n", "**velocity** $= \\begin{pmatrix}\n", "10 \\\\\n", "50 \\\\\n", "5000 \\\\\n", "\\end{pmatrix}$\n", "\n", "Note: by convention vectors are generally presented in the form of columns. Also, vector names are generally lowercase to distinguish them from matrices (which we will discuss below) and in bold (when possible) to distinguish them from simple scalar values such as ${meters\\_per\\_second} = 5026$.\n", "\n", "A list of N numbers may also represent the coordinates of a point in an N-dimensional space, so it is quite frequent to represent vectors as simple points instead of arrows. A vector with 1 element may be represented as an arrow or a point on an axis, a vector with 2 elements is an arrow or a point on a plane, a vector with 3 elements is an arrow or point in space, and a vector with N elements is an arrow or a point in an N-dimensional space… which most people find hard to imagine.\n", "\n", "\n", "## Purpose\n", "Vectors have many purposes in Machine Learning, most notably to represent observations and predictions. For example, say we built a Machine Learning system to classify videos into 3 categories (good, spam, clickbait) based on what we know about them. For each video, we would have a vector representing what we know about it, such as:\n", "\n", "**video** $= \\begin{pmatrix}\n", "10.5 \\\\\n", "5.2 \\\\\n", "3.25 \\\\\n", "7.0\n", "\\end{pmatrix}$\n", "\n", "This vector could represent a video that lasts 10.5 minutes, but only 5.2% viewers watch for more than a minute, it gets 3.25 views per day on average, and it was flagged 7 times as spam. As you can see, each axis may have a different meaning.\n", "\n", "Based on this vector our Machine Learning system may predict that there is an 80% probability that it is a spam video, 18% that it is clickbait, and 2% that it is a good video. This could be represented as the following vector:\n", "\n", "**class_probabilities** $= \\begin{pmatrix}\n", "0.80 \\\\\n", "0.18 \\\\\n", "0.02\n", "\\end{pmatrix}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vectors in python\n", "In python, a vector can be represented in many ways, the simplest being a regular python list of numbers:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[10.5, 5.2, 3.25, 7.0]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[10.5, 5.2, 3.25, 7.0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we plan to do quite a lot of scientific calculations, it is much better to use NumPy's `ndarray`, which provides a lot of convenient and optimized implementations of essential mathematical operations on vectors (for more details about NumPy, check out the [NumPy tutorial](tools_numpy.ipynb)). For example:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 10.5 , 5.2 , 3.25, 7. ])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "video = np.array([10.5, 5.2, 3.25, 7.0])\n", "video" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The size of a vector can be obtained using the `size` attribute:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "video.size" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The $i^{th}$ element (also called *entry* or *item*) of a vector $\\textbf{v}$ is noted $\\textbf{v}_i$.\n", "\n", "Note that indices in mathematics generally start at 1, but in programming they usually start at 0. So to access $\\textbf{video}_3$ programmatically, we would write:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.25" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "video[2] # 3rd element" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting vectors\n", "To plot vectors we will use matplotlib, so let's start by importing it (for details about matplotlib, check the [matplotlib tutorial](tools_matplotlib.ipynb)):" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2D vectors\n", "Let's create a couple very simple 2D vectors to plot:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [ "u = np.array([2, 5])\n", "v = np.array([3, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These vectors each have 2 elements, so they can easily be represented graphically on a 2D graph, for example as points:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x_coords, y_coords = zip(u, v)\n", "plt.scatter(x_coords, y_coords, color=[\"r\",\"b\"])\n", "plt.axis([0, 9, 0, 6])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vectors can also be represented as arrows. Let's create a small convenience function to draw nice arrows:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def plot_vector2d(vector2d, origin=[0, 0], **options):\n", " return plt.arrow(origin[0], origin[1], vector2d[0], vector2d[1],\n", " head_width=0.2, head_length=0.3, length_includes_head=True,\n", " **options)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's draw the vectors **u** and **v** as arrows:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAEACAYAAACatzzfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFrdJREFUeJzt3W+MpWV5x/Hvtcwu3WWBoSpqWWGAxvgnykArEv/UKbsi\nrUTTF0asiRkl+qI1gDaIwaRLiS3worpqTRpbxWqxNVCof0IVlBkMJAIK46KwrUhOWdQlkgoNoA3s\nXH3xnHFnZ8/Zc505zzn3dZ7z+ySTOc/ZZ8/+cmb2mmeu+7nv29wdERHJa0PpACIicngq1CIiyalQ\ni4gkp0ItIpKcCrWISHIq1CIiyYUKtZkda2bXmdkDZvYjM3v1sIOJiEhlKnjeJ4Cb3P1tZjYFbBli\nJhERWcV6TXgxs6OBJXc/dTSRRERktUjr4xTgMTO7xszuMbPPmNnmYQcTEZFKpFBPAWcAn3b3M4Cn\ngQ8PNZWIiPxGpEf9CLDX3b/XPr4euHTtSWamRUNERPrk7tbrnJ5X1O7+KLDXzF7cfmo7cH+Xc1N9\n7Ny5s3gGZWpOpqy5lGl8M0VF7/q4ELjWzDYCDwHvDv8LBbVardIRDqFMMRkzQc5cyhSTMVNUqFC7\n+w+AVw05i4iIdNDomYnz8/OlIxxCmWIyZoKcuZQpJmOmqJ73UYdfyMzrei0RkUlgZngdg4njbHFx\nsXSEQyhTTMZMkDOXMsVkzBTV6EItItIEan2IiBSi1oeISEM0ulBn7EkpU0zGTJAzlzLFZMwU1ehC\nLSLSBOpRi4gUoh61iEhDNLpQZ+xJKVNMxkyQM5cyxWTMFNXoQi0i0gTqUYuIFKIetYhIQzS6UGfs\nSSlTTMZMkDOXMsVkzBTV6EItItIE6lGLiBSiHrWISEM0ulBn7EkpU0zGTJAzlzLFZMwU1ehCLSLS\nBOpRi4gUoh61iEhDNLpQZ+xJKVNMxkyQM5cyxWTMFNXoQi0i0gTqUYuIFKIetYhIQzS6UGfsSSlT\nTMZMkDOXMsVkzBTV6EItItIEoR61mbWAJ4Bl4Bl3P7PDOepRi4j0Idqjngq+3jIw5+6/HCyWiIj0\nK9r6sD7OTSNjT0qZYjJmgpy5lCkmY6aoaPF14JtmdreZvXeYgURE5GDRHvUL3H2fmT0PuAV4v7vf\nvuYc9ah7+cpX4JWvhJNPLp1ERBKotUft7vvan39hZjcCZwK3rz1vfn6emZkZAKanp5mdnWVubg44\n8GvHxB5feSVcdhlzu3bBRReVz6NjHet45Mcrj1utFn1x98N+AFuAre3HRwF3AOd0OM+zWVhYKB2h\nsnu3+1FHuW/c6AuXXlo6zSHSvE+rZMzknjOXMsVkzNSumz3rcOSK+vnAjWbmVFfg17r7zf39OJhg\n+/bB9u3w1FNwzDFw1FGlE4nImNFaH8P0q1/BmWfCnj3w7LNw7LFwww1w9tmlk4lIAlrro7TlZXj7\n2+HBB6siDeBeFWsRkT40ulCvbuCP3Ec+At/+Nvz61weeW15mcc+ecpm6KPo+dZExE+TMpUwxGTNF\nNbpQF/PFL8InPwlPP33w8888ox61iPRNPeq63XEHvPGNVX96LbPqCnvTptHnEpF0oj1qFeo6ucPx\nx8Njj3X+86mp6qpaRAQNJgIFelJm8KlPwSteAZs3wxFHHPznW7ak7JMpU1zGXMoUkzFTVKMLdRHn\nnw+7d8Odd8L+/dVzW7dWn9WfFpF1UOtjWK64AnbuhCefhOuug499DE48Eb7+9dLJRCQJ9ahLM4NT\nToGf/OTAc+7V8yIiqEcNFOxJrdwrffOamfZmKftkyhSXMZcyxWTMFNXoQl3Mjh3V51NPLZtDRBpB\nrY+6LS9Xd3tcfTV86EOl04hIYmp9lPLRj1afL7mkbA4RaYxGF+oiPamdO6tBxC6Dhhn7ZMoUlzGX\nMsVkzBTV6EI9ct0GEUVEBqAedZ22bYOf/rS6DU9EpAf1qEdtebkq0ldfXTqJiDRMowv1SHtSwUHE\njH0yZYrLmEuZYjJmimp0oR6pHoOIIiLrpR51HfbsgZe+tNp2S5NcRCRIa32MkgYRRWQdNJjIiHpS\nfQ4iZuyTKVNcxlzKFJMxU1SjC/VIaCaiiAyZWh+D6rScqYhIgFofo6CZiCIyAo0u1EPvSa1jOdOM\nfTJlisuYS5liMmaKanShHirNRBSREVGPer1W9kRcXtYkFxFZF91HPWwaRBSRAdU+mGhmG8zsHjP7\n6mDRRmdoPakBBhEz9smUKS5jLmWKyZgpqp8e9UXA/cMKMla0J6KIjFCo9WFm24BrgL8GPujub+lw\nzmS0PrQnoojUpO7Wx8eBS4AJqMQ9aCaiiIzYVK8TzOzNwKPuvmRmc0DX6j8/P8/MzAwA09PTzM7O\nMjc3BxzoD43yeGlpiYsvvrje128vZ7p4223r+vsrz5V4P7odr81WOg/Arl27in//dDpeeS5LHn39\n4sdDqQfr+P5ZXFyk1WrRF3c/7AfwN8DDwEPAz4EngS90OM+zWVhYqPcFH3jAHdwffHDdL1F7phoo\nU1zGXMoUkzFTu272rMN93Z5nZm8A/sIntUet5UxFpEZa66NumokoIoX0Vajd/bZOV9NZre4LDaym\nQcRaM9VEmeIy5lKmmIyZonRFHaU9EUWkEE0hj9CeiCIyBFrro04aRBSRIdBgIjX1pGoeRMzYJ1Om\nuIy5lCkmY6aoRhfqWmgmoogUptZHL1rOVESGRK2POmhPRBFJoNGFeuCe1BCWM83YJ1OmuIy5lCkm\nY6aoRhfqgWgmoogkoR51N9oTUUSGTPdRD0qDiCIyZBpMZICe1BAHETP2yZQpLmMuZYrJmCmq0YV6\n3bQnoogkotbHWtoTUURGRK2P9dJMRBFJptGFel09qSEvZ5qxT6ZMcRlzKVNMxkxRjS7UfdNMRBFJ\nSD3q1bScqYiMkHrU/dJMRBFJqtGFuq+e1IgGETP2yZQpLmMuZYrJmCmq0YW6L9oTUUSSUo8atCei\niBShtT76oUFEESlAg4kEe1IjHkTM2CdTpriMuZQpJmOmqEYX6hDNRBSR5NT60HKmIlKIWh8Rmoko\nImOg0YW6Z0+qwHKmGftkyhSXMZcyxWTMFDXV6wQzOxL4DrCpff717v5Xww42dCuDiFddVTqJiMhh\nhXrUZrbF3Z82syOAO4AL3f2uNeeMV49aeyKKSGG19qjd/en2wyOprqrHqCJ3oZmIIjImQoXazDaY\n2b3APuAWd797uLHq0bUnVXAQMWOfTJniMuZSppiMmaJ69qgB3H0ZON3MjgH+3cxe5u73rz1vfn6e\nmZkZAKanp5mdnWVubg448CaN8nhpaanzn+/YwSLA3r3MtQcSR5VvRYn3Y5yOl5aWUuXR16+/44xf\nv671YITHK49brRb96Ps+ajP7S+BJd//YmufHo0e9sifiVVfBpZeWTiMiE6y2HrWZPdfMjm0/3gzs\nAPYMHrGQlZmI2rhWRMZEpEf9QmDBzJaAO4FvuvtNw41Vj7W/rgLFBxE7ZipMmeIy5lKmmIyZonr2\nqN39PuCMEWQZPs1EFJExNFlrfWg5UxFJRGt9rKWZiCIyphpdqA/qSSUZRMzYJ1OmuIy5lCkmY6ao\nRhfqg2gmooiMqcnoUWtPRBFJSHsmrqZBRBFJSIOJtHtSyQYRM/bJlCkuYy5lismYKarRhRpIM4go\nIrJezW99aE9EEUlKrQ/QTEQRaYRGF+rF17++epDoTo+MfTJlisuYS5liMmaKam6hXl6Gxx5LM4go\nIrJeze1Ra09EEUlO91FrEFFEkpvswcT2IOLiFVcUDnKojH0yZYrLmEuZYjJmimpmod6xo/p8wgll\nc4iI1KB5rQ/tiSgiY2JyWx+aiSgiDdO8Qr1qOdOMPSllismYCXLmUqaYjJmimlWoNRNRRBqoWT1q\nLWcqImNk8nrUyZYzFRGpS3MKdYdBxIw9KWWKyZgJcuZSppiMmaKaU6i1J6KINFQzetTaE1FExtBk\nrfWhQUQRGUOTM5h4mEHEjD0pZYrJmAly5lKmmIyZosa/UGsmoog0XM/Wh5ltA74AvADYD/yDu3+y\nw3llWh9azlRExlS09TEVeK1ngQ+6+5KZbQW+b2Y3u/uegVMOSjMRRWQC9Gx9uPs+d19qP34SeADI\nsX7oynKmXe70yNiTUqaYjJkgZy5lismYKaqvHrWZzQCzwJ3DCNMXzUQUkQkRaX0A0G57XA9c1L6y\nPsT8/DwzMzMATE9PMzs7y9zcHHDgp1ltxxdcUB23BxG7nb+i9n+/Qcdzc3Op8qxYXFxMkyfzsb5+\n8ePV2Ur9+4uLi7RaLfoRuo/azKaArwP/4e6f6HLOaAcTNYgoImOu7vuoPwfc361Ij1xwEHHtT9EM\nlCkmYybImUuZYjJmiupZqM3stcA7gbPN7F4zu8fMzh1+tMPoMYgoItIk4zeFXHsiikhDNHcKuWYi\nisiEGb9C3cdyphl7UsoUkzET5MylTDEZM0WNV6HWTEQRmUDj1aPWcqYi0iDN61FrJqKITKjxKdTr\nGETM2JNSppiMmSBnLmWKyZgpanwKtfZEFJEJNR49au2JKCIN1Kw9EzWIKCIN1JzBxAEGETP2pJQp\nJmMmyJlLmWIyZorKX6g1E1FEJlz+1oeWMxWRhmpG60MzEUVEkhfqAZczzdiTUqaYjJkgZy5lismY\nKSpvodZMRBERIHOP+oorqkkuy8ua5CIijTT+91FrEFFEGm68BxNrGkTM2JNSppiMmSBnLmWKyZgp\nKmeh1p6IIiK/ka/1oT0RRWRCjG/rQzMRRUQOkq9Q17icacaelDLFZMwEOXMpU0zGTFG5CrVmIoqI\nHCJXj1rLmYrIBBm/HrVmIoqIdJSnUA9hEDFjT0qZYjJmgpy5lCkmY6aoPIVaeyKKiHSUo0etPRFF\nZALVttaHmX0WOA941N1feZjz1l+oNYgoIhOozsHEa4A3DR6piyEOImbsSSlTTMZMkDOXMsVkzBTV\ns1C7++3AL4eWQDMRRUQOK9SjNrOTgK8NpfWh5UxFZEJFWx9TowjTlWYi1m7/fjjtNHjkkdj5ZvD5\nz8Nb3zrUWCIygFoL9fz8PDMzMwBMT08zOzvL3NwccKA/dNDx297GHMCpp3b+8wGPl5aWuPjii2t7\nvTqOV54b5r/31FPwxBMr/95c+/Ohxxs3wqteNcfy8iIr8Uq/PyvHu3bt6v39U+B45bkseVZnyZIH\ncn79MtSDlcetVou+uHvPD2AGuK/HOd6X/fvdwf2qq/r7e31YWFgY2muv1ygyXX65+6ZN1dvb7WPz\nZvedO6svw6S+T+uRMZcyxWTM1K6bPWtw5Pa8L1Fdhj0HeBTY6e7XdDjPe73WQbQn4tDccgucc07n\nP9u4EbZuhRtvhDe8YbS5RORg+fdM1CBirVoteM97YGGh+zlbtsDpp8MNN8Dxx48smoh0kXtRphEN\nIq7uC2VRZ6ZWC84+u/qZd/LJVZE+77xqIPHyy2HTpgPnbt5c3QH5ne8cWqSb/j7VKWMuZYrJmCmq\nTKHWnojrdrji7A5f+xqccAKcf361o9nGjXDccfCNb1Sdpg15VncRkaDRtz60J2LfOrU1zjsP/v7v\nq6LczWmnwdFHq9UhklXeHrUGEUPWW5xXW7nHQ1fRIjnl7VGPcDnTjD2pw2WKtjWizGJFetzep5Iy\n5lKmmIyZokY7M1EzEQ9Rx5WziDTbaFsfWs4UUHEWkUq+tT4mfE9EFWcRWa/R9agLLGdauifVqed8\n1lmL6+45D0vp96mTjJkgZy5lismYKWp0hXpC9kTsNSB45ZU5irOIjI/R9Kgbviei2hoish657qNu\n4CCiirOIDCrPfdQFBxHr7knVcZ9zxj6ZMsVlzKVMMRkzRQ3/ro8x3xNRV84iUtrwWx9juJypirOI\njEKO+6jHaCaiirOIZDXcHnXh5Ux79aRaLdi+vb61NerIVIIyxWXMpUwxGTNFDe+KOulMxFYLLrgA\nbr31wHO6chaRzIbXo060nKmKs4hkVP4+6sKDiCrOIpJd2fuoCw0iru0533rr4tB7zv3K2CdTpriM\nuZQpJmOmqOEU6hEOIh5anA8MCC4s5CjOIiKDqL/1MYI9EdXWEJEmKHcf9ZBmIqo4i8ikqr/1UeNy\npodra0R6zhl7UsoUkzET5MylTDEZM0XVe0VdwyCirpxFRA5Wb4/6hBPWtZypirOITKIyPeo+ZiKq\nOIuIxIR61GZ2rpntMbP/MrPD38pxmEHEQXvO/crYk1KmmIyZIGcuZYrJmCmqZ6E2sw3A3wFvAl4O\nvMPMXtLx5A6DiKMuzqstLS0N54UHoEwxGTNBzlzKFJMxU1TkivpM4Mfu/t/u/gzwr8BbO57ZHkQs\nWZxXe/zxx4f/j/RJmWIyZoKcuZQpJmOmqEiP+gRg76rjR6iK9yG2v+9U9ZxFRGoWKdSdRiQ73tax\ncuWcpTi3Wq3SEQ6hTDEZM0HOXMoUkzFTVM/b88zsLOBydz+3ffxhwN396jXnNWeLcRGREallmVMz\nOwL4T2A78HPgLuAd7v5AHSFFROTwerY+3H2/mb0fuJlq8PGzKtIiIqNT28xEEREZjoEXZeprMsyI\nmNlnzexRM9tdOssKM9tmZrea2f1mdp+ZXZgg05FmdqeZ3dvOtLN0phVmtsHM7jGzr5bOAmBmLTP7\nQfu9uqt0HgAzO9bMrjOzB8zsR2b26gSZXtx+j+5pf34iyff6B8zsh2a228yuNbNNCTJd1P5/17se\nuPu6P6gK/YPAScBGYAl4ySCvWccH8DpgFthdOsuqTC8AZtuPt1L1/TO8V1van48AvgucWTpTO88H\ngH8Gvlo6SzvPQ8BxpXOsyfR54N3tx1PAMaUzrcm3AfgZ8KLCOX6n/fXb1D7+MvCuwpleDuwGjmz/\n37sFOLXb+YNeUccnw4yQu98O/LJ0jtXcfZ+7L7UfPwk8QHWPelHu/nT74ZFU/9mL98LMbBvwx8A/\nls6yijGsHZHWwcyOBl7v7tcAuPuz7v6/hWOttQP4ibvv7Xnm8B0BHGVmU8AWqh8gJb0U+K67/5+7\n7wduA/6k28mDfuN1mgxTvPhkZ2YzVFf8d5ZN8psWw73APuAWd7+7dCbg48AlJPihsYoD3zSzu83s\nvaXDAKcAj5nZNe02w2fMbHPpUGu8HfiX0iHc/WfA3wIPAz8FHnf3b5VNxQ+BPzCz48xsC9WFyYu6\nnTxooQ5PhpGKmW0Frgcual9ZF+Xuy+5+OrANeLWZvaxkHjN7M/Bo+7cPo/P3WAmvcfffp/oP9edm\n9rrCeaaAM4BPu/sZwNPAh8tGOsDMNgJvAa5LkGWa6jf9k6jaIFvN7E9LZnL3PcDVwLeAm6jaxs92\nO3/QQv0IcOKq422U/5UirfavXdcDX3T3r5TOs1r71+ZF4NzCUV4LvMXMHqK6GvtDM/tC4Uy4+772\n518AN9JlGYURegTY6+7fax9fT1W4s/gj4Pvt96u0HcBD7v4/7TbDDcBrCmfC3a9x999z9zmqVu2P\nu507aKG+G/hdMzupPYp6PpBilJ5cV2MrPgfc7+6fKB0EwMyea2bHth9vpvqG3lMyk7tf5u4nuvsp\nVN9Pt7r7u0pmMrMt7d+EMLOjgHOofnUtxt0fBfaa2YvbT20H7i8Yaa13kKDt0fYwcJaZ/ZaZGdV7\nVXwuiJk9r/35RKr+dNf3a6CNAzzpZBgz+xIwBzzHzB4Gdq4MuhTM9FrgncB97Z6wA5e5+zcKxnoh\n8E/tpWw3AF9295sK5snq+cCN7WUSpoBr3X39+83V50Lg2nab4SHg3YXzAAf90H9f6SwA7n6XmV0P\n3As80/78mbKpAPg3M/ttqkx/5u5PdDtRE15ERJJLc7uRiIh0pkItIpKcCrWISHIq1CIiyalQi4gk\np0ItIpKcCrWISHIq1CIiyf0/qw4ATRntajAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_vector2d(u, color=\"r\")\n", "plot_vector2d(v, color=\"b\")\n", "plt.axis([0, 9, 0, 6])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3D vectors\n", "Plotting 3D vectors is also relatively straightforward. First let's create two 3D vectors:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "a = np.array([1, 2, 8])\n", "b = np.array([5, 6, 3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's plot them using matplotlib's `Axes3D`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.mplot3d import Axes3D\n", "\n", "subplot3d = plt.subplot(111, projection='3d')\n", "x_coords, y_coords, z_coords = zip(a,b)\n", "subplot3d.scatter(x_coords, y_coords, z_coords)\n", "subplot3d.set_zlim3d([0, 9])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is a bit hard to visualize exactly where in space these two points are, so let's add vertical lines. We'll create a small convenience function to plot a list of 3d vectors with vertical lines attached:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_vectors3d(ax, vectors3d, z0, **options):\n", " for v in vectors3d:\n", " x, y, z = v\n", " ax.plot([x,x], [y,y], [z0, z], color=\"gray\", linestyle='dotted', marker=\".\")\n", " x_coords, y_coords, z_coords = zip(*vectors3d)\n", " ax.scatter(x_coords, y_coords, z_coords, **options)\n", "\n", "subplot3d = plt.subplot(111, projection='3d')\n", "subplot3d.set_zlim([0, 9])\n", "plot_vectors3d(subplot3d, [a,b], 0, color=(\"r\",\"b\"))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Norm\n", "The norm of a vector $\\textbf{u}$, noted $\\left \\Vert \\textbf{u} \\right \\|$, is a measure of the length (a.k.a. the magnitude) of $\\textbf{u}$. There are multiple possible norms, but the most common one (and the only one we will discuss here) is the Euclidian norm, which is defined as:\n", "\n", "$\\left \\Vert \\textbf{u} \\right \\| = \\sqrt{\\sum_{i}{\\textbf{u}_i}^2}$\n", "\n", "We could implement this easily in pure python, recalling that $\\sqrt x = x^{\\frac{1}{2}}$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "|| [2 5] || =\n" ] }, { "data": { "text/plain": [ "5.3851648071345037" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def vector_norm(vector):\n", " squares = [element**2 for element in vector]\n", " return sum(squares)**0.5\n", "\n", "print(\"||\", u, \"|| =\")\n", "vector_norm(u)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, it is much more efficient to use NumPy's `norm` function, available in the `linalg` (**Lin**ear **Alg**ebra) module:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.3851648071345037" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy.linalg as LA\n", "LA.norm(u)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot a little diagram to confirm that the length of vector $\\textbf{v}$ is indeed $\\approx5.4$:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nzhn0/wHrBhfDSiWHRwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "radius = LA.norm(u)\n", "plt.gca().add_artist(plt.Circle((0,0), radius, color=\"#DDDDDD\"))\n", "plot_vector2d(u, color=\"red\")\n", "plt.axis([0, 8.7, 0, 6])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks about right!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Addition\n", "Vectors of same size can be added together. Addition is performed *elementwise*:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [2 5]\n", "+ [3 1]\n", "----------\n" ] }, { "data": { "text/plain": [ "array([5, 6])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\" \", u)\n", "print(\"+\", v)\n", "print(\"-\"*10)\n", "u + v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at what vector addition looks like graphically:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nBksAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_vector2d(u, color=\"r\")\n", "plot_vector2d(v, color=\"b\")\n", "plot_vector2d(v, origin=u, color=\"b\", linestyle=\"dotted\")\n", "plot_vector2d(u, origin=v, color=\"r\", linestyle=\"dotted\")\n", "plot_vector2d(u+v, color=\"g\")\n", "plt.axis([0, 9, 0, 7])\n", "plt.text(0.7, 3, \"u\", color=\"r\", fontsize=18)\n", "plt.text(4, 3, \"u\", color=\"r\", fontsize=18)\n", "plt.text(1.8, 0.2, \"v\", color=\"b\", fontsize=18)\n", "plt.text(3.1, 5.6, \"v\", color=\"b\", fontsize=18)\n", "plt.text(2.4, 2.5, \"u+v\", color=\"g\", fontsize=18)\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vector addition is **commutative**, meaning that $\\textbf{u} + \\textbf{v} = \\textbf{v} + \\textbf{u}$. You can see it on the previous image: following $\\textbf{u}$ *then* $\\textbf{v}$ leads to the same point as following $\\textbf{v}$ *then* $\\textbf{u}$.\n", "\n", "Vector addition is also **associative**, meaning that $\\textbf{u} + (\\textbf{v} + \\textbf{w}) = (\\textbf{u} + \\textbf{v}) + \\textbf{w}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have a shape defined by a number of points (vectors), and you add a vector $\\textbf{v}$ to all of these points, then the whole shape gets shifted by $\\textbf{v}$. This is called a [geometric translation](https://en.wikipedia.org/wiki/Translation_%28geometry%29):" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ni45/ywAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t1 = np.array([2, 0.25])\n", "t2 = np.array([2.5, 3.5])\n", "t3 = np.array([1, 2])\n", "\n", "x_coords, y_coords = zip(t1, t2, t3, t1)\n", "plt.plot(x_coords, y_coords, \"c--\", x_coords, y_coords, \"co\")\n", "\n", "plot_vector2d(v, t1, color=\"r\", linestyle=\":\")\n", "plot_vector2d(v, t2, color=\"r\", linestyle=\":\")\n", "plot_vector2d(v, t3, color=\"r\", linestyle=\":\")\n", "\n", "t1b = t1 + v\n", "t2b = t2 + v\n", "t3b = t3 + v\n", "\n", "x_coords_b, y_coords_b = zip(t1b, t2b, t3b, t1b)\n", "plt.plot(x_coords_b, y_coords_b, \"b-\", x_coords_b, y_coords_b, \"bo\")\n", "\n", "plt.text(4, 4.2, \"v\", color=\"r\", fontsize=18)\n", "plt.text(3, 2.3, \"v\", color=\"r\", fontsize=18)\n", "plt.text(3.5, 0.4, \"v\", color=\"r\", fontsize=18)\n", "\n", "plt.axis([0, 6, 0, 5])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, subtracting a vector is like adding the opposite vector." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiplication by a scalar\n", "Vectors can be multiplied by scalars. All elements in the vector are multiplied by that number, for example:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.5 * [2 5] =\n" ] }, { "data": { "text/plain": [ "array([ 3. , 7.5])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"1.5 *\", u, \"=\")\n", "\n", "1.5 * u" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Graphically, scalar multiplication results in changing the scale of a figure, hence the name *scalar*. The distance from the origin (the point at coordinates equal to zero) is also multiplied by the scalar. For example, let's scale up by a factor of `k = 2.5`:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "k = 2.5\n", "t1c = k * t1\n", "t2c = k * t2\n", "t3c = k * t3\n", "\n", "plt.plot(x_coords, y_coords, \"c--\", x_coords, y_coords, \"co\")\n", "\n", "plot_vector2d(t1, color=\"r\")\n", "plot_vector2d(t2, color=\"r\")\n", "plot_vector2d(t3, color=\"r\")\n", "\n", "x_coords_c, y_coords_c = zip(t1c, t2c, t3c, t1c)\n", "plt.plot(x_coords_c, y_coords_c, \"b-\", x_coords_c, y_coords_c, \"bo\")\n", "\n", "plot_vector2d(k * t1, color=\"b\", linestyle=\":\")\n", "plot_vector2d(k * t2, color=\"b\", linestyle=\":\")\n", "plot_vector2d(k * t3, color=\"b\", linestyle=\":\")\n", "\n", "plt.axis([0, 9, 0, 9])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you might guess, dividing a vector by a scalar is equivalent to multiplying by its multiplicative inverse (reciprocal):\n", "\n", "$\\dfrac{\\textbf{u}}{\\lambda} = \\dfrac{1}{\\lambda} \\times \\textbf{u}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Scalar multiplication is **commutative**: $\\lambda \\times \\textbf{u} = \\textbf{u} \\times \\lambda$.\n", "\n", "It is also **associative**: $\\lambda_1 \\times (\\lambda_2 \\times \\textbf{u}) = (\\lambda_1 \\times \\lambda_2) \\times \\textbf{u}$.\n", "\n", "Finally, it is **distributive** over addition of vectors: $\\lambda \\times (\\textbf{u} + \\textbf{v}) = \\lambda \\times \\textbf{u} + \\lambda \\times \\textbf{v}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Zero, unit and normalized vectors\n", "* A **zero-vector ** is a vector full of 0s.\n", "* A **unit vector** is a vector with a norm equal to 1.\n", "* The **normalized vector** of a non-null vector $\\textbf{u}$, noted $\\hat{\\textbf{u}}$, is the unit vector that points in the same direction as $\\textbf{u}$. It is equal to: $\\hat{\\textbf{u}} = \\dfrac{\\textbf{u}}{\\left \\Vert \\textbf{u} \\right \\|}$\n", "\n" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAD7CAYAAAClvBX1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAH31JREFUeJzt3Xt0VeWd//H39yQhkBAauUdu8YIgKAZRvLU21mlltJ3p\ntLqs1kssrdXR39hR27pax8tobe30Nq3tLDuDRem4dKq1Xla9oBLxhlhJAEUuWoPIxXINBEIgOc/v\njx0EYgInOSfnOc8+n9daLNiHwzmfk9pvdj5772ebcw4REQlLwncAERHpPg1vEZEAaXiLiARIw1tE\nJEAa3iIiAdLwFhEJUGG23sjMdE6iiEgPOOes42NZ3fN2zvXar5tvvrlXX7+3fym/sit/mL96O39X\nYlObNDQ0+I6QFuX3J+TsoPy++cofm+EtIpJPYjO8a2pqfEdIi/L7E3J2UH7ffOW3A3UqGX0jM5et\n9xIRiQszw/k+YNmbamtrfUdIi/L7E3J2UH7ffOWPzfAWEcknqk1ERHJY7GsTEZF8Epvhrd7Mr5Dz\nh5wdlN83dd4iIpIydd4iIjlMnbeISIzEZnirN/Mr5PwhZwfl902dt4iIpEydt4hIDlPnLSISI2kP\nbzMrNrPXzKzOzBab2c2ZCNZd6s38Cjl/yNlB+X3zlT/t26A551rM7Azn3A4zKwBeNrMnnXPzM5BP\nREQ6kdHO28xKgLnAlc651zv8nTpvEZFu6tXO28wSZlYHrANmdxzcIiKSWRm5e7xzLglMNrMBwJ/M\nbIJzbknH59XU1FBZWQlAeXk5VVVVVFdXA3t7o55u/+IXv8jo62V7W/n9be/bWeZCHuXPrXzZzl9b\nW8vMmTMBPpqXncn4qYJmdhPQ5Jz7WYfHe7U2qa2t/egLESLl9yfk7KD8vvV2/q5qk7SHt5kNBnY7\n5xrNrB/wNPAj59yfOzxPnbeISDd1NbwzUZtUAPeaWYKoQ3+w4+AWEZHMSvuApXNusXPueOdclXNu\nknPuB5kI1l379k4hUn5/Qs4Oyu+br/y6wlJEJEBa20REJIdpbRMRkRiJzfBWb+ZXyPlDzg7K75s6\nbxERSZk6bxGRHKbOW0QkRmIzvNWb+RVy/pCzg/L7ps5bRERSps5bRCSHqfMWEYmR2Axv9WZ+hZw/\n5Oyg/L6p8xYRkZSp8xYRyWHqvEVEYiQ2w1u9mV8h5w85Oyi/b+q8RUQkZeq8RURymDpvEZEYic3w\nVm/mV8j5Q84Oyu+bOm8REUmZOm8RkRymzltEJEZiM7zVm/kVcv6Qs4Py+6bOW0REUqbOW0Qkh6nz\nFhGJkdgMb/VmfoWcP+TsoPy+qfMWEZGUqfMWEclh6rxFRGIkNsNbvZlfIecPOTsov2/qvEVEJGXq\nvEVEcpg6bxGRGEl7eJvZSDN73syWmNliM/uXTATrLvVmfoWcP+TsoPy++cpfmIHXaAWudc7Vm1l/\n4A0ze8Y5tzQDry0iIp3IeOdtZn8CfuWce67D4+q8RUS6KSudt5lVAlXAa5l8XRER2V/Ghnd7ZfIQ\ncI1zrilTr5sq9WZ+hZw/5Oyg/L6F3HljZoVEg3uWc+7Rrp5XU1NDZWUlAOXl5VRVVVFdXQ3s/QL0\ndLu+vj6tf+97W/m1rW1tV1dXU1tby8yZMwE+mpedyUjnbWb3ARucc9ce4DnqvEVEuqmrzjvt4W1m\npwFzgcWAa//1PefcUx2ep+EtItJNvXbA0jn3snOuwDlX5Zyb7Jw7vuPgzoY9P3aESvn9CTk7KL9v\nvvLrCksRkQBpbRMRkRymtU1ERGIkNsNbvZlfIecPOTsov2/qvEVEJGXqvEVEcpg6bxGRGInN8FZv\n5lfI+UPODsrvmzpvERFJmTpvEZEcps5bRCRGYjO81Zv5FXL+kLOD8vumzltERFKmzltEJIep8xYR\niZHYDG/1Zn6FnD/k7KD8vqnzFhGRlKnzFhHJYeq8RURiJDbDW72ZXyHnDzk7KL9v6rxFRCRl6rxF\nRHKYOm8RkRiJzfBWb+ZXyPlDzg7K75s6bxERSZk6bxGRHKbOW0QkRmIzvNWb+RVy/pCzg/L7ps5b\nRERSps5bRCSHqfMWEYmR2Axv9WZ+hZw/5Oyg/L6p8xYRkZSp8xYRyWHqvEVEYiQ2w1u9mV8h5w85\nOyi/b0F33mY2w8w+NLNFmXg9ERE5sIx03mb2SaAJuM85N6mL56jzFhHppl7tvJ1zLwGbM/FaIiJy\ncOq8s6w1mWRNSwt127bx7KZNPLlxI49v2MCPHn2UZzZt4pXGRt5tbmZ7W5vvqN0Syte/M7mQ/dVX\nYf367m83NcGcObVZy9kbcuHrnw5f+Quz+WY1NTVUVlYCUF5eTlVVFdXV1cDeL0BPt+vr69P695ne\nfuzZZ3m3uRmqqnipsZFX585lc2sruyZNojiRwOrrMaBw8mQAWp59loKVKymcPJk259ixYAEJYNCJ\nJzK2pIRRS5YwrqSEr551Fof368fcF17Iqc+ba1//0LYvvLCWtjYYMiTafu+9Wvr3P/h2aWk1V1wB\nZrn1ebTd8+3a2lpmzpwJ8NG87EzGzvM2szHA4/naee9sa+OFxkYe3bCBRzdsYMPu3fRLJNiZTNKS\ngc+dAEoLCkg6RxI4/ROf4LyhQ5k2cCAjiovTfn3x6/bb4d/+LfXnl5XBL38J550HpaW9l0v866rz\nzuTwriQa3sd28fexG94tySSPbdjAr1evZt7WrRQnEjS1tZHM0vuXJhK0OkdFcTGXDR/O9IoKDfJA\nvfkmHNvp/3M+buBAePFFmDChdzNJbujVA5Zmdj/wCnCUmb1vZpdl4nW7Y8+PHdmwuKmJK5cvZ/DL\nLzN92TJeaGykxTm2pjO422uH7tjevlffsHMnP3z/fY6YN4/T6+p4eP16diWz9S0kks2vf6blQvb3\n34dDDz3wcwoL4Y474KGH4Oij9z6eC/nTofw9k5HO2zl3YSZeJ9e90tjI9e++S31TE7uTSVp9B9rH\nzvZh/WJjI/VNTRSZcWtlJV+vqKBvQYHndNKVZctg2zZ45BG4/nq49trOnzdyJDz6KBx/fHbzSe7S\n2iYpeLmxkW+/+y4Lm5rYkeU92nSUJhIUJxLcUlnJNzTEc0JbG2zdCr/5DVx9NfzHf0QDuaAATjsN\nKiqgtcNewcUXRxXJDTf4ySx+9XrnnUKA4Ib3qp07+fqyZbzU2BjU0O6oNJGgpKCAGePG8YXBg33H\n6bE//hHeegteeQXuvx8OOSR6/P/+D2bNgscf95vvQF56CcaOhZkzo+Hdty9861vRgcc9du6EE06I\nPiPAsGFw771w1lleIkuOiP3CVJnsnVqTSX7y/vuMnz+f57dsyc7g7kHnnartySTrd+/mK0uWMG3h\nQj7YuTPj79Hbvd+aNdDQEJ2R0dAA7WdKAtHw3ncIdldvZN+xAxob4bnn4EtfggcfhLVr4dvfhh/8\nIPocHTMXF8NRR0V/Hj8ebroptcGtztivoDvvOFnc1MS5b73F6paWoPe2O7MjmeS5zZsZN38+dx5+\nOFeNGIHZx76h56TZs6GmBhYtgnfegalT9/7diy9GB/J8cy66cObaa6OfCo47Di64ACZNgiFDDv7v\nzeD3v4eHH4YLL4yqFJGuqDbZx+/WruXqFStoTibJ7aTpK00kOKO8nPsnTKCsMJzv4f/6r7BkCTz9\ndLS9ZEl0it0778Bhh2U/j3PRnvTgwbBwIfz4x1BbC5//fDSMRdIV+9okHTvb2rh4yRKuXrGCHXkw\nuCGqUp7dsoUJr7/Om01NvuOk7KGH4Nxz927PnQujR2d3cL/8clSHfPOb0eXpRUXRsP75z6Mq5Atf\n0OCW3heb4d3T3mltSwtVf/kLD2/Y4Lcm6cXOuys7k0lWt7Rw0oIFPPS3v6X1Wtno/TZvhtWr969M\n5s6Fz3wm+nNPq5ODZd++HVatgu9/PxrWjz0GiQR87WvRsP7ud6NT+fr27dn7p0udsV/qvD1YvmMH\np9fVsbG1ldYcr3R6iyPqwi9ZupS1u3bx/0aO9B2pSyUl0UG9PXu1y5fDM8/AjTdGBzFT6ZVTlUxG\n3fOZZ8Kdd0Z79wMHRgP6zjsz9z4iPZW3nffipiZOr6ujsa0tL2qSVJQkEtwwejT/doDFcHy79154\n4gmYPBmGDo0G6j33RFcc/vCH0VWIPbV2bTSc//zn6ABp//7RudUjRqgGEX90nvc+FjU18am6OrYG\ntuxqNpQkElw3ahT/7uPonwe7d8OKFdHg79MHvvxlqK6OahFfNYjIvmJ/wDLV3umDnTs5o74+9wa3\nh867MzuSSX66ahX/vWZNt/5dSL1lc3N0vvWtt0ar+f31r7VcdRXMmAFnnx3VMyEN7pC+9p1R/p7J\nq867sbWV0+vraex4/bHsZ0cyyTXvvMOo4mKmDRrkO05GPPxwVH08/3y0lz1yZHTe+IAB0QU/J5/s\nO6FI9+RNbbIrmeTT9fXUbduWkfW1c96qVTBqVFovUZJI8NLkyUxO5/JFT9asic5Ouffe6ErFW2+N\nLpgpL4fDD/edTiR1sa9NDua6d99lUVNTfgzuJ56A226LjrylYUcyybRFi4L4ScW56JL0u++OVum7\n447oaswJE6IDj3sWgNLglriIzfA+UO80e9Mm7lm7Nrcvd89U5/3EE9GJyb/9LWzZAk8+mdbLNba2\nctnSpQd9nq/eb/Hi6GP++Mdwyy3w9ttRPXLXXdGedk3NwV9Dnatfyt8zse+8N+zaxflLluT24M6k\n447bW5dceGG0yn8aWpzj6U2bmLVuHRcPH56BgOlpbY3OEJk3L1pJcPfu6JL5a67Z/xxwkbiLfed9\n1sKF1G7Zwq58qEt6UWkiwVtTpzLG02kY69dHa4g0N0fLpn75y1GnfcQRXuKIZE1XnXes97yf3LiR\nlxobNbgzoMU5rlq+nCcmdXp/6YxLJuG//is6ZW/JkmgJ1aoquOiivRfiDByYlSgiOSm2nffuZJIr\nli8Ppy5Jt/OeOxfuuy9aaGPbtr2Pz5kD3/teeq8NtDrHnC1beHHLlk7/PhO93+LF0aJPN9wQHXxc\nuTK6YObGG6OzRGpq0ruCsivqXP1S/p6JzfDu6NerV7Nx927fMbJjwwZYtw4uuST6feHCvX9XWwv9\n+mXkbXYkk3x92TKSGfpJprUVPvwwWo2vqSk6yLh1a7TQVP/+0UHII47Ye8ccEdkrlp13Y2srI199\nlaZcu4qytzz1FJx6alQMf/Ob8MAD0QLTEN3GZfp0OOecjLxVaSLBr8eO5dKKih6/xnPPwUknRav0\nHXYY/O1v0ZmNuvmAyMflVef92zVrMrZ3GIRp06LfZ82KVmzaM7gbGqJ7cWXwluPbk0lubmjgkuHD\nU74Lz9atUd3xyCNRLbJlS3S7r5/9TANbpKdiU5vs6Z1ak0l+vGpVOF33Hpk4z/uFF+DTn967vWhR\ntPReGnvJndnY2srszZv3e6xj7+ccLFsW3WR3+vTosvSzz47OGLn//uhsxlwZ3Opc/VL+nondnvcj\nGzawM7TBnQnbtkXd9/jxex9buDDaE4fo5ogXXZSRt2pqa+O2lSv5XIfTPZqb4Ve/is69bmuDK66I\nBvZnP6vzr0UyLXad93Gvv86i7dt7/X1yzq5d0f23fvOb6CjfqlVw9dVw8cXwyU/CX/4S3asrQ/ol\nEiyYMoUPXi1l1y545RX4znfgJz+J3ra8PFpiVUTSkxfrea/cuZPx8+fn5543RAcu582DI4+MTtEo\nK4sujx8zBr7xjY/3FG+8Ab/8ZffeI9kf2gZC8zl8fdbJJB+pZvr0aBnVqqrMfRQRicT+gGVtbS0L\njjiCYH86r69Pf/pNm7b34OUep5/e9fObm6NTC3ftOsgLFwJfAJ4BbgOeg+GOp2w7q2ZEz4h6v+qe\n5fastraW6upq3zF6TPn98pU/NgcsAWauW0dzvu5198TUqdEtYzo1CigGrgP+HfhS9HCfy+HKUvjf\nk9hYVsayHTuyElVE9heb2mRtSwuHzZuXH0u+ZtIdd8Czz0anh1AAnAx8ERgP3AKsAJqhOBGdgnj7\n7dB+j8tiM24cM4Ybc/ielyKhi31t8sKWLfRJJGjJlwtzMqG5Gf7mwH0fGAEsAB4Hfg/sc5VmcXF0\nMPTyy6Go6KOHW5zj8Y0bNbxFPIhNbfLAM8+EfUVltu5h+eF6uLIWzvgfOPtlWPgGsA24HvhvYB0f\nDe6ioui0kTvvhKuu2m9w77F4+3aSzgV9rm7I2UH5fdPaJmmqb2pChUkXXlkNF/8czngSvnIZLB0J\nozfBD4+GOX+E89ZAwc79/01xcXTJ/axZ0RrhXUgAK5qbeze/iHxMLDrvXckk/V98kd3quyNJB7Pn\nw0+Xw+4Hgd8B/wsTJsEtx8KQIfs//7334MoroaUlOp2wT5/opO0UjqD3Lyjg12PHckkO3KhBJI5i\n3Xm/09xM30SC3SHXJuna3Qp3z4eHbwXuBDYAU+D8Zri0P/T7Vtf/9rDDosWxN2yIFh255Za966Mc\nRFNbGwu2bdPwFsmyWNQmq1taSNbV+Y6Rnp503pua4Ke/hDPugs+9Bg8fDwyDq9fC7GkwZwJccXlq\nS8Jedx388z9HF+2kOLj3eKe5OejeMuTsoPy+Bb22iZlNA35B9M1ghnPuzky8bqo+aGmhLV8qk9Wr\n4Ud/gDePA6YAu+CQ9+DKv4PP9gXu69nrTpkS/eqBVS0tPXtPEemxtDtvM0sAy4EzgTXA68BXnHNL\nOzyv1zrv2xoauKWhgdhenvOXt+AHf4UtBUAr8CCM+grcNAmOHOM7HUOLivjwtNN8xxCJpd7svKcC\nK5xzK9vf6AHgH4GlB/xXGfTezp3hDu61a2HGDNi4EQYNitZPHTYM7lsC9/6RaO/6buAO+PRrcPn5\ncOg/eA69v02trb4jiOSdTHTeI4BV+2x/0P5Y1mxva8veedKZtHYtXH99dGuZ+vro9wu/CWeeA/e2\nfwnPPgSefgjmHAO3TIdD+/vN3IlW55gzZ47vGD2mztUv5e+ZTOx5d7YWVFYL6GBPEZwxA9as6fDg\nNpg4EX5VDnaTl1jdZZBfdy4SyQGZGN4fAKP32R5J1H1/TE1NDZXtl1KXl5dTVVX10Wpce7579WT7\no+8e+67Mt2dPPJe3GxroVJ8+e28inEt5u9h2RL3cvqurpfO/Z7a3q6urcyqP8udWvmznr62tZebM\nmQAfzcvOZOKAZQGwjOiA5VpgPnCBc+7tDs/rtQOWF7z1Fg+sX98rr92rbr89qko6OvNMuPHG7Ofp\nIQOSAS/pKZLLujpgmXbn7ZxrA64mWuz5LeCBjoO7tw0qKgqz854+HQ49dP/HDj00ejwgfROJoHvL\nkLOD8vsWcueNc+4pYFwmXqsnDuvXjwIguOsrKyqi+4bNmAErV0Z3vJk+PeM3DO5tg4qKokvrRSRr\nYrG2yQMffsjly5ezLZ8vj/fopLIy5vXwAh8RObBeq01ywYji4nh8kECN6dvXdwSRvBOLmTemb1+a\nFyzwHSM9IXb2RP8BjevXL+jeMuTsoPy++cofi+E9qriYhAV76+Gg9S8oYOqAAb5jiOSdWHTeAKfX\n1fFiY2Ovvb50rtiM9085haF9+viOIhJLse68Ac485JB4LE4emAGFhRrcIh7EZniXLFpESUGB7xg9\nF2jnPbWsDAi7tww5Oyi/b+q80zSptJSWZLBrCwapf0EB5w0d6juGSF6KTecNcM6iRfx506ZefQ/Z\nq48Z6049lUM6uau8iGRG7DtvgEuHD6cs5OokMFPKyjS4RTyJzfCura3l7IED2RVqdRJY512aSHDZ\nPjcdDrm3DDk7KL9v6rwzoH9hIZ8fNCheHypHJYFzhwzxHUMkb8Wq8wao27aNT9bVsSPUPfAAFAE1\nFRX8dpy3tchE8kZedN4Ak8vKOLqkxHeMWCtIJPjOqFG+Y4jktdgM7317p5sqK+kf2oHLQDpvA04b\nMIAjO3yDDLm3DDk7KL9v6rwz6PODBlGhq/56Rd9Egh8dfrjvGCJ5L3ad9x5zt2zh7xctUvedQUVm\n/NPgwTw4caLvKCJ5I2867z1OLy/n0+XlFGq1wYwpMuPnRx7pO4aIEKPh3Vnv9OuxYykKZXjneOdd\n0n6Q8tDi4k7/PuTeMuTsoPy+qfPuBYf168eNY8ZQmoj1x+x1BlT06cN3R4/2HUVE2sW2894j6Ryn\nLljAG01NtHp4/zgoSSR4fcoUJpSW+o4iknfyrvPeI2HGw8ccQz/tffdIafvZJRrcIrklNhPtQL3T\niOJi7hs/npJcHuA52Hn3TSQ4ZcAArh4x4qDPDbm3DDk7KL9v6rx72ReHDOG7o0bl9gDPIYVmjCou\n5o/HHIOFctBXJI/EvvPel3OOmqVLeWj9ep3/fQAGDC4qov6EE7o8u0REsiNvO+99mRkzxo3jpAED\n6Ku9yS6VFhQwp6pKg1skh8VmeKfaOxUmEjx+7LFM6t+fvrlUoeRI512aSPDUpElM7OYBypB7y5Cz\ng/L7ps47i0oLCqitquLEsjKdhdLOgLL2Pe7TPvEJ33FE5CDyqvPuaFcyyQVLlvDUpk153YEXAIcU\nFTG3qoqjdUqgSE5R592JPokEf5g4katHjMjbs1BKEgnGl5RQN2WKBrdIQGIzsXraOyXMuPOII/jD\nxImUFRTgbRVwD513SSLBRcOGseCEExjZt29arxVybxlydlB+39R5e3b2oEEsPvFExpWUxH4vPEF0\nYHLGuHHcPW4cfWL+eUXiKK877860JJPc3tDATz/4gJZkkrg14aWJBMf278+s8eM/djccEck9XXXe\nGt5dWL5jB5e8/TZvbt/O9hgczCw2o28iwV1jx/LVYcN01aRIIGJ/wDLTvdNRJSW8evzx/OaooxhU\nWNj7y8r2UuddRLRGyYVDh/LXk0/mouHDe2Vwh9xbhpwdlN83X/kLvbxrIMyMS4YP5/yhQ7ln7Vpu\namigua0tiD3xIjMKzDh/yBBuPewwxqR5QFJEcktatYmZnQvcAhwNnOicW3CA5wZVm3RmVzLJPWvX\nctvKlWxta2N7Wxu59on6JxK0AecPGcItGtoiweuVztvMxgFJ4G7g+rgP7z2cc7zU2Mhdq1fz2MaN\nFIDXvfEiMwrNOLJfP741ciTnDRlCWaF+qBKJg17pvJ1zy5xzK4iurvYqm72TmfGp8nIenDiRD089\nlV+NHctZhxxCv0SCAT09V7ybnXdZQQF9zJhQUsINo0fzxpQpLDrxRL5WUeFlcIfcW4acHZTfN3Xe\ngRpQWMhlFRVcVlHB7mSSeVu38tjGjTy3eTPLduwAorWxt7e10dbD9yhNJEiY0ZxMMrK4mKllZXxx\n8GA+N3Agg4qKMvdhRCQYB61NzGw2MGzfhwAHfN8593j7c+YA1x2sNrn00kuprKwEoLy8nKqqKqqr\nq4G9373itO2c44hTTqG+qYk/Pfssa1pa2HXccazbtYs1r70WradSVUXSOVx9PQVAvylTGFRURN9F\nixhcVMTUT32KY0pL2V1Xx5i+ffncZz6TM59P29rWdua3a2trmTlzJgCVlZXceuutvXeed6rDOy6d\nt4hItmTjPG+vvfee71yhUn5/Qs4Oyu+br/xpDW8z+6KZrQJOBp4wsyczE0tERA5El8eLiOSw2F8e\nLyKST2IzvNWb+RVy/pCzg/L7FmTnLSIifqjzFhHJYeq8RURiJDbDW72ZXyHnDzk7KL9v6rxFRCRl\n6rxFRHKYOm8RkRiJzfBWb+ZXyPlDzg7K75s6bxERSZk6bxGRHKbOW0QkRmIzvNWb+RVy/pCzg/L7\nps47TfXdvIFvrlF+f0LODsrvm6/8sRneW7Zs8R0hLcrvT8jZQfl985U/NsNbRCSfxGZ4NzQ0+I6Q\nFuX3J+TsoPy++cqf1VMFs/JGIiIx09mpglkb3iIikjmxqU1ERPKJhreISIBiNbzN7Fwze9PM2szs\neN95UmFm08xsqZktN7Pv+s7THWY2w8w+NLNFvrP0hJmNNLPnzWyJmS02s3/xnak7zKzYzF4zs7r2\n/Df7ztRdZpYwswVm9pjvLN1lZg1mtrD96z8/2+8fq+ENLAb+CXjBd5BUmFkCuAs4C5gIXGBm4/2m\n6pbfEWUPVStwrXNuAnAKcFVIX3/nXAtwhnNuMlAF/L2ZTfUcq7uuAZb4DtFDSaDaOTfZOZf1r3us\nhrdzbplzbgXwsSOzOWoqsMI5t9I5txt4APhHz5lS5px7CdjsO0dPOefWOefq2//cBLwNjPCbqnuc\nczva/1gMFALBnIFgZiOBs4H/8Z2lhwyPMzRWwztAI4BV+2x/QGDDIy7MrJJo7/U1v0m6p712qAPW\nAbOdc6/7ztQNPwe+TUDfcDpwwNNm9rqZfSPbb16Y7TdMl5nNBobt+xDRF/H7zrnH/aTqsc5+Qgj1\nP+RgmVl/4CHgmvY98GA455LAZDMbAPzJzCY453K+hjCzc4APnXP1ZlZNOD8t7+tU59w6MxsCzDaz\nt9t/Gs2K4Ia3c+6zvjNk0AfA6H22RwJrPGXJS2ZWSDS4ZznnHvWdp6ecc1vNrBaYRhgd8mnAP5jZ\n2UA/oMzM7nPOXeI5V8qcc+vaf19vZo8Q1aBZG95xrk1C+E7+OnCkmY0xsz7AV4DQjrobYXytu3IP\nsMQ595++g3SXmQ02s0+0/7kf8HfAUr+pUuOc+55zbrRz7nCi/+6fD2lwm1lJ+09smFkp8DngzWxm\niNXwNrMvmtkq4GTgCTN70nemA3HOtQFXA88AbwEPOOfe9psqdWZ2P/AKcJSZvW9ml/nO1B1mdhrw\nVeAz7ad7LTCzab5zdUMFMMfM6om6+qedc3/2nClfDANeaj/eMA943Dn3TDYD6PJ4EZEAxWrPW0Qk\nX2h4i4gESMNbRCRAGt4iIgHS8BYRCZCGt4hIgDS8RUQCpOEtIhKg/w87gD6Ob6jZzwAAAABJRU5E\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.gca().add_artist(plt.Circle((0,0),1,color='c'))\n", "plt.plot(0, 0, \"ko\")\n", "plot_vector2d(v / LA.norm(v), color=\"k\")\n", "plot_vector2d(v, color=\"b\", linestyle=\":\")\n", "plt.text(0.3, 0.3, \"$\\hat{u}$\", color=\"k\", fontsize=18)\n", "plt.text(1.5, 0.7, \"$u$\", color=\"b\", fontsize=18)\n", "plt.axis([-1.5, 5.5, -1.5, 3.5])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dot product\n", "### Definition\n", "The dot product (also called *scalar product* or *inner product* in the context of the Euclidian space) of two vectors $\\textbf{u}$ and $\\textbf{v}$ is a useful operation that comes up fairly often in linear algebra. It is noted $\\textbf{u} \\cdot \\textbf{v}$, or sometimes $⟨\\textbf{u}|\\textbf{v}⟩$ or $(\\textbf{u}|\\textbf{v})$, and it is defined as:\n", "\n", "$\\textbf{u} \\cdot \\textbf{v} = \\left \\Vert \\textbf{u} \\right \\| \\times \\left \\Vert \\textbf{v} \\right \\| \\times cos(\\theta)$\n", "\n", "where $\\theta$ is the angle between $\\textbf{u}$ and $\\textbf{v}$.\n", "\n", "Another way to calculate the dot product is:\n", "\n", "$\\textbf{u} \\cdot \\textbf{v} = \\sum_i{\\textbf{u}_i \\times \\textbf{v}_i}$\n", "\n", "### In python\n", "The dot product is pretty simple to implement:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def dot_product(v1, v2):\n", " return sum(v1i * v2i for v1i, v2i in zip(v1, v2))\n", "\n", "dot_product(u, v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But a *much* more efficient implementation is provided by NumPy with the `dot` function:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(u,v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Equivalently, you can use the `dot` method of `ndarray`s:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u.dot(v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Caution**: the `*` operator will perform an *elementwise* multiplication, *NOT* a dot product:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [2 5]\n", "* [3 1] (NOT a dot product)\n", "----------\n" ] }, { "data": { "text/plain": [ "array([6, 5])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\" \",u)\n", "print(\"* \",v, \"(NOT a dot product)\")\n", "print(\"-\"*10)\n", "\n", "u * v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Main properties\n", "* The dot product is **commutative**: $\\textbf{u} \\cdot \\textbf{v} = \\textbf{v} \\cdot \\textbf{u}$.\n", "* The dot product is only defined between two vectors, not between a scalar and a vector. This means that we cannot chain dot products: for example, the expression $\\textbf{u} \\cdot \\textbf{v} \\cdot \\textbf{w}$ is not defined since $\\textbf{u} \\cdot \\textbf{v}$ is a scalar and $\\textbf{w}$ is a vector.\n", "* This also means that the dot product is **NOT associative**: $(\\textbf{u} \\cdot \\textbf{v}) \\cdot \\textbf{w} ≠ \\textbf{u} \\cdot (\\textbf{v} \\cdot \\textbf{w})$ since neither are defined.\n", "* However, the dot product is **associative with regards to scalar multiplication**: $\\lambda \\times (\\textbf{u} \\cdot \\textbf{v}) = (\\lambda \\times \\textbf{u}) \\cdot \\textbf{v} = \\textbf{u} \\cdot (\\lambda \\times \\textbf{v})$\n", "* Finally, the dot product is **distributive** over addition of vectors: $\\textbf{u} \\cdot (\\textbf{v} + \\textbf{w}) = \\textbf{u} \\cdot \\textbf{v} + \\textbf{u} \\cdot \\textbf{w}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculating the angle between vectors\n", "One of the many uses of the dot product is to calculate the angle between two non-zero vectors. Looking at the dot product definition, we can deduce the following formula:\n", "\n", "$\\theta = \\arccos{\\left ( \\dfrac{\\textbf{u} \\cdot \\textbf{v}}{\\left \\Vert \\textbf{u} \\right \\| \\times \\left \\Vert \\textbf{v} \\right \\|} \\right ) }$\n", "\n", "Note that if $\\textbf{u} \\cdot \\textbf{v} = 0$, it follows that $\\theta = \\dfrac{π}{2}$. In other words, if the dot product of two non-null vectors is zero, it means that they are orthogonal.\n", "\n", "Let's use this formula to calculate the angle between $\\textbf{u}$ and $\\textbf{v}$ (in radians):" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Angle = 0.868539395286 radians\n", " = 49.7636416907 degrees\n" ] } ], "source": [ "def vector_angle(u, v):\n", " cos_theta = u.dot(v) / LA.norm(u) / LA.norm(v)\n", " return np.arccos(np.clip(cos_theta, -1, 1))\n", "\n", "theta = vector_angle(u, v)\n", "print(\"Angle =\", theta, \"radians\")\n", "print(\" =\", theta * 180 / np.pi, \"degrees\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: due to small floating point errors, `cos_theta` may be very slightly outside of the $[-1, 1]$ interval, which would make `arccos` fail. This is why we clipped the value within the range, using NumPy's `clip` function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Projecting a point onto an axis\n", "The dot product is also very useful to project points onto an axis. The projection of vector $\\textbf{v}$ onto $\\textbf{u}$'s axis is given by this formula:\n", "\n", "$\\textbf{proj}_{\\textbf{u}}{\\textbf{v}} = \\dfrac{\\textbf{u} \\cdot \\textbf{v}}{\\left \\Vert \\textbf{u} \\right \\| ^2} \\times \\textbf{u}$\n", "\n", "Which is equivalent to:\n", "\n", "$\\textbf{proj}_{\\textbf{u}}{\\textbf{v}} = (\\textbf{v} \\cdot \\hat{\\textbf{u}}) \\times \\hat{\\textbf{u}}$\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAD7CAYAAABDld6xAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt0FeW9//H3E4JAiBAVAREBLwfFWgzqQRpEgyJHtIJS\nqVRqpaWoK/JD7PFCpQjVo3i09VLFAygKqK0XBARveIFIoIpCQYOItGCUi9xqQAS5JHl+fzy5wk4y\ngdl7ZrI/r7WyJjN79uwPs/S7J9+ZecZYaxERkfBKCTqAiIjUTIVaRCTkVKhFREJOhVpEJORUqEVE\nQk6FWkQk5FL92pAxRtf5iYjUkbXW1LaOr0fU1tpQ/4wZMybwDMqpnMqpnGU/XiVV66OgoCDoCJ4o\np7+U01/KmXhJVahFRKIoqQr14MGDg47giXL6Szn9pZyJZ+rSJ6lxQ8ZYv7YlIpIMjDHYRJ9MDLvc\n3NygI3iinP5STn8pZ+IlVaEWEYkitT5ERAKi1oeISD2RVIU6Kj0r5fSXcvpLORMvqQq1iEgUqUct\nIhIQ9ahFROqJpCrUUelZKae/lNNfypl4noY5NcYUADuAEmC/tbZrPEOJiEgFTz1qY8xa4GxrbWEN\n66hHLSJSB373qE0d1hURER95Lb4WmGuM+dgYMzSegeIpKj0r5fSXcvpLORPPa6HOstaeA1wK3GSM\nOS+OmZLbl1/C6tVBpxCREPF0MtFau6l0utUYMxPoCiw8cL3BgwfToUMHADIyMsjMzCQ7Oxuo+HYL\ner5MWPJUmd+xg+ybbiK7dWtyO3YMPo+H+TJhyRNrPjs7O1R5apovE5Y82p/+58nNza3z02dqPZlo\njEkDUqy13xtjmgJvA3+01r59wHo6mXg49uyBn/wEPv0UevaEd98NOpGIxJmfJxNbAQuNMcuAD4E5\nBxbpqDjwWzY0Skrgqqtg1SooKSG3uDjoRJ6Edn8eQDn9pZyJV2vrw1r7JZCZgCzJ65ZbYP58d1QN\nkJERbB4RCRWN9RG0v/wFfv972L27YtmYMTB2bGCRRCQxvLY+PJ1MlDiZPRtGjoQffqhYdsQRcNRR\nwWUSkdBJqptYQtWzWrIEfvGLqkUaoGFDcr/5JphMdRSq/VkD5fSXciZeUhXq0CgogIsvrtruKNOg\nAaSnJzySiISXetSJVlgImZmwfr272uNAzZvDrFlQev2liNRfGo86rMaMgQ0bYhdpAGtdsRYRKZVU\nhToUPavbbnOX42VkwJFHHvx6cTG5q1YlPtchCMX+9EA5/aWciZdUhToUTjgBHnwQtm6FUaPcsiOO\ngMaN3e9FRdC0aXD5RCR01KMOUkYG7NgB33wDzzwDjz0G27fDd99Bqq6cFKnvvPaoVaiDsm8fNGoE\nEybADTe4Zda6Iq0etUhS0MnEGELVs7r5Zje9/vqKZcZA8+bhylkD5fSXcvorKjm9SKpCHSoTJsAF\nF7jiLCJSA7U+gvDee9CrF2zbBsccE3QaEQmIetRhVnYUrf0lktTUo44hFD2rHTvc9I03ql0lFDk9\nUE5/Kae/opLTi6Qq1KEwcKCb9ukTbA4RiQy1PhLNGLjuOpgyJegkIhIwtT7CaNo0N50wIdgcIhIp\nSVWoA+9ZXXdd1dvFqxF4To+U01/K6a+o5PQiqQp1oNatc9MPPww2h4hEjnrUidKpk3vKuPaRiJRS\njzpMSkpckR4zJugkIhJBSVWoA+tZ3Xuvm951l6fVo9JbU05/Kae/opLTi6Qq1IG56y7o2BFStLtF\npO7Uo4635cuhSxf46ito1y7oNCISIhrrIyyaNIE9e3QSUUQOopOJMSS8Z7V3ryvSTz9dp7dFpbem\nnP5STn9FJacXSVWoEy4nx00HDw40hohEm1of8WQMXHwxvP120ElEJITU+gjaW2+56UsvBZtDRCIv\nqQp1QntWZcOYZmTU+a1R6a0pp7+U019RyelFUhXqhCksdFO1PETEB5571MaYFGAJsN5a2zfG6+pR\nl7noIpg3T5fkiUiN4tGjvhlYeeiRkoS1rkgPHRp0EhGpJzwVamNMW+BS4Kn4xomvhPSsJk9208cf\nP+RNRKW3ppz+Uk5/RSWnF16PqB8GbgP0t3xthg6F9HT3gAARER+k1raCMeYyYLO1drkxJhuotp8y\nePBgOnToAEBGRgaZmZlkZ2cDFd9uQc+Xicv2N20iG+Dvfz+s7WVnZ4dmfwW6P32a1/7U/gxTntzc\nXAoKCqiLWk8mGmPuA34JFAFNgCOBGdbaXx2wnk4mnnwyrF2rk4gi4olvJxOttXdaa9tZa08CBgLz\nDizSUXHgt6yvSkpckS4be/owxDWnj5TTX8rpr6jk9ELXUful7Oktv/99sDlEpN7RWB9+MQbOOAPy\n84NOIiIRobE+EmnJEjctG99DRMRHSVWo49azOvdcNz3+eF82F5XemnL6Szn9FZWcXiRVoY6LH35w\nJxKfey7oJCJST6lHfbiuvdYV6WT8t4vIYdEzExPFGPjpT2HOnKCTiEjE6GRiDL73rMqK81//6utm\no9JbU05/Kae/opLTi6Qq1L7rWzra65FHBptDROo1tT4O1bZtcOyxMH8+lN7PLyJSF+pRx1uPHrBw\noU4iisghU486Bt96Vta6Ij1smD/bO0BUemvK6S/l9FdUcnqRVIXaN0884aYPPRRsDhFJCmp9HApj\n4Oij4d//DjqJiESYWh/x8q9/uenChcHmEJGkkVSF2peeVc+ebtqp0+FvqxpR6a0pp7+U019RyelF\nUhXqw1ZcDOvXw5/+FHQSEUki6lHXxe23w4MPukGYTK1tJRGRGuk66ngwBs46C5YuDTqJiNQDOpkY\nw2H1rD74wE1ff92XLDWJSm9NOf2lnP6KSk4vkqpQH5asLDdt3TrYHCKSdNT68GLXLkhPh5deggED\ngk4jIvWEetR++vnP4eWXNa6HiPhKPeoYDrln9fLL0L+/r1lqEpXemnL6Szn9FZWcXiRVoT4kM2a4\n6bRpweYQkaSl1kdtyq6Xro//NhEJlFoffti82U01roeIBCipCnWde1aXX+6m3bv7nqUmUemtKae/\nlNNfUcnpRVIV6jqxFj7+GH73u6CTiEiSU4+6Og8/7Ir0/v2Qmhp0GhGph3Qd9eEyxt2F+M03QScR\nkXoquU8mzpgB99wDffpAYWH54s/GjKnoO9dk1So3ff/9OAWsWVR6a8rpL+X0V1RyelH/CvXGjVBQ\nAKNHu2mlYtsyNxeOPLL2bZx/vpt27BiPhCIidVL/Wh9Tp7qj5vXr4eyz4auvoE0b91qrVnDffTBk\nSPXvLyqChg3h0Udh+PDEZBaRpORbj9oY0whYABwBpALTrbV/jLFeOAp1mVtugZUrYe5cN79yJfz4\nx+6ZhyeeWP37RoxwRVoPBxCROPOtR22t3Qv0tNZ2ATKBPsaYrj5kjK/p0+GqqyrmFyzgh5Ytay7S\n4Ip0t26BFumo9NaU01/K6a+o5PTCU4/aWru79NdGuKPqEB06x1BYCBs2QNdK3ycLFrC9Sxf3+333\nxX7fggVuOnt2fPOJiNSBpx61MSYFWAqcDIy31v4+xjrhaX3s3QsZGbB4MXTuDKtXu4H///AHuOIK\neOcdGDr04PdpXA8RSSCvrQ9Pd3JYa0uALsaYZsAsY8zp1tqVB643ePBgOnToAEBGRgaZmZlkZ2cD\nFX+GJGS+USM+v/lmjhk+nJa9e0PLlqwYPpzjXnyRYzZsgHHjDn7/G2+4+ZkzE59X85rXfFLMl/1e\nUFBAnVhr6/QD3AX8LsZyG3bz58+v/sV+/awNyb+hxpwhopz+Uk5/RSFnad2ste7W2qM2xrQwxjQv\n/b0J0AtYVbevgwh49VUYODDoFCIiB/Fyed6Pgam4E48pwIvW2ntjrGdr21Zo/e1vcM017tmIaWlB\npxGRJKGxPupCJxFFJADJPdZHNSo39Mtt3OimixcnNEtNYuYMIeX0l3L6Kyo5vUiqQh3TpZe6adfw\n38MjIskpuVsf1kJKCowcCePGBZ1GRJKMWh9ePPCAm/7P/wSbQ0SkBklVqA/qWY0cCe3aQYMGgeSp\nTlR6a8rpL+X0V1RyepFUhbqKFSvcdP78YHOIiNQieXvUGRmwY4cuyRORwKhHXZN9+1yR/r//CzqJ\niEitkqpQl/esbr7ZTW+4IbAsNYlKb005/aWc/opKTi+SqlCXmzDBPRdRT3ARkQhIvh71e+9Br16w\nbRscc0zQaUQkiWmsj+poXA8RCQmdTIwh97XX3C9l05CKSm9NOf2lnP6KSk4vkqpQc/fdbnrZZcHm\nEBGpg+RqfRgDv/oVTJ0adBIREbU+DjJtmptOnBhsDhGROkqeQn3ddeSmpEDjxkEnqVVUemvK6S/l\n9FdUcnqRHIV63To31Z2IIhJBydGj7tQJVq3SJXkiEirqUZcpKXFF+q67gk4iInJI6n+hvrf0gelj\nxkSmZ6Wc/lJOfyln4tX/Qn3XXXDKKe6RWyIiEVS/e9TLl0OXLlBQAO3bB51GRKQKjfUB0KQJ7Nmj\nk4giEko6mbh3ryvSTz9dvijontXkyZNp3bo1u3fvrnG9oHN6pZz+Uk5/RSWnF/W3UOfkuOngwYHG\nqKx169YMHTqUtLS0oKOISITU39aHMW7c6XfeCTqJiEhMyd36eOstN3355WBziIj4oH4W6j593DQj\no8risp7VpEmTGDZsGMOHD2ft2rXcfffdjB49mgEDBrB9+3YAHnnkEXJycujbty8vvPACw4YNIysr\ni1tvvbXKNqdMmUJOTg733XcfQ4YM4e233z4ozhNPPMG4cePo2bMnW7ZsqTV+Wc4ZM2Zwzz330KdP\nHwoLCwFYsmQJLVq0YOXKlXXZI3ERlR6gcvpLORMvNegAvistaMQomAAbN26kpKSEO++8k7Zt29K0\naVPGjRsHwI033sjIkSMZPnw4Rx99NLfffjsnnXQSrVq14sknn6R3795s2rSpfFvXXnstxhimTp2K\nMYbCwkJOOukkPvnkE9q1awe4Qp6VlUVmZiYzZ87k+eef55Zbbqn1n7FhwwbWrVvH6NGj6dSpE++/\n/z5XXHEFbdq0wRjD559/zumnn36YO0tEIsFa68uP21QIXHihtTVkeeWVV+zXX39t33vvPZuenm6L\niorKX7v99tvtqaeeavPy8uzOnTvtzJkzbXp6ut21a9dB23nwwQdty5Yt7e7du6ssb9mypR0/fry1\n1tri4mI7ZswYa621JSUltnnz5nbKlCme/hlPPfWULSwstPn5+bZhw4b2m2++KX/tjjvusB9//LGn\n7YhIeJXWzVrra62tD2NMW2PMPGPMSmNMvjFmeNy/PQ6VtTBvHvz2t9Wu0r9/f0444QTy8vLo3r07\nDRo0KH8tPz+fI488kvPOO4/09HTmz59P9+7dD7pKY//+/Tz44IMMGTKEJk2alC/ftWsXW7duZc+e\nPQCkpKQwduxYAJYtW8bOnTvp0aOHp3/KkCFDyMjIKD+Sb926dflrTZs25ayzzvK0HRGJPi896iLg\nd9ba04GfADcZY06Lb6xD9NRTbjp+fMyXK/es8vLy6NmzZ/n8/v37WbhwIRdeeGH5snnz5lVZp8yq\nVavYunXrQa+9+eabGGPIzs4+6D0LFy7kuOOO46STTqr1n1E550svvUT//v2rvF5SUkJKCG6Jj0oP\nUDn9pZyJV+v/7dbaTdba5aW/fw98Dhwf72CH5PrroWlTOOKIGlcrLi7mww8/rFJoZ82aRUlJCTml\n119v3bqVlStXxizUxcXFGGNo27ZtleVPPvkkl112Wcyj3by8PM4//3wA9u7dy8SJExk4cCBFRUUA\nDB069KAThFu3bmXz5s1Vtjd37tyYXwQiUo956Y/Yij50B6AASI/xWkJ6OtX68kvXm/7kk1pXXbx4\nsU1JSbGzZ8+21lq7bds2e+KJJ9pp06aVr/PCCy/YZs2a2eLi4oPeX1JSYk899VQ7a9as8mWTJk2y\nnTt3ttu2bYv5ma1bt7ZPPPGEtdb1yffs2WNPO+208v53u3btDup379u3zzZt2tQuWbLEWmttYWGh\nHT16dK3/PhGJBjz2qD1f9WGMSQemAzdbd2QdLhdd5KadO9e6al5eHtnZ2eTn57Ns2TL++c9/MmHC\nBHr37l2+zldffcXVV18ds8VgjGHOnDmMGjWK5cuXs337dtLT0/nggw9i3nW4evVqNm/eXH5E3adP\nHz7//HNOOeUU0tLS+PLLLzn++OOr9LsBGjZsyLPPPsv9999PZmYm+/fv584776zLXhGResBToTbG\npOKK9LPW2lerW2/w4MF06NABgIyMDDIzM8v/TC/rF8VlvqSE3LVr4Te/Ibs0S6z1ly9fzogRI8jL\ny+O4444jKyuryuu5ubnl8127dqVr167l/7YDt7dhwwZycnKqvP+jjz6KmS8vL49mzZqxdetWAJo0\nacLjjz9Ox44dAVi0aBHt27fnjTfe4NJLL63SW7vyyiu58sory5c1Ln3mY1z3p8f5sv0ZljzVzVfe\nn2HIU9289mf9359lvxcUFFAnXg67gWnAQ7Wsk5i/FSpZu3atHTRokM1u394OArt2zZoa158/f761\n1toWLVrYOXPmxDXbihUrylsZAwYMsNdcc02V13NycuzcuXOttdYOHjzYzpw50z799NNVcoadcvpL\nOf0VhZx4bH3UOtaHMaY7sADIB2zpz53W2rcOWM/Wti0/ffnll1x88cWsWbOmfNnJJ5/MO++8w4kn\nnljt+/Lz8znzzDPZtGkTLVu2jEu21atX06lTJyZMmEBWVhY9e/Zk0aJF/Md//Ef5On//+9958cUX\n6datG5s2beLbb7+lV69eXHDBBXHJJCLh43Wsj8je8DJo0KCyLw0LAy2cYgE7aNCgat/z8ssv29NP\nP92mpKTYvn372hUrVsQl2/bt2+35559v77jjDjto0CCbn58fl88RkWjDrxtewmrDhg2V5tKAEsDd\nIr5zZ+z3tGjRgs8++4zi4mJeffVVfvSjH8UlW/PmzXn//fe5//77ee655zjjjDPq9P7K/awwU05/\nKae/opLTi8gW6jZt2lSaexpYC0CrVu0480zYtSuQWCIivovseNRXXXUVM195pfQ42inrUbdteyIN\nG7pla9a40U5HjkxYNBERT+r1eNQ7duzgs88+Ky/S55xzDoMGDSo/kVhWpME9NrFyh2PzZqjlSVgi\nIqESuUK9b98+rrrqKlatWlW+rF+/fjz33HMxr/Zo0wYuv9z9npuby9/+BpMmJSrtoYlKb005/aWc\n/opKTi8iVag//PBDTjvtNN59993yZampqYwaNcrzNkaMcD9lbr4ZvvjCz5QiIv6KVI96zJgx3H33\n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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "u_normalized = u / LA.norm(u)\n", "proj = v.dot(u_normalized) * u_normalized\n", "\n", "plot_vector2d(u, color=\"r\")\n", "plot_vector2d(v, color=\"b\")\n", "\n", "plot_vector2d(proj, color=\"k\", linestyle=\":\")\n", "plt.plot(proj[0], proj[1], \"ko\")\n", "\n", "plt.plot([proj[0], v[0]], [proj[1], v[1]], \"b:\")\n", "\n", "plt.text(1, 2, \"$proj_u v$\", color=\"k\", fontsize=18)\n", "plt.text(1.8, 0.2, \"$v$\", color=\"b\", fontsize=18)\n", "plt.text(0.8, 3, \"$u$\", color=\"r\", fontsize=18)\n", "\n", "plt.axis([0, 8, 0, 5.5])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrices\n", "A matrix is a rectangular array of scalars (ie. any number: integer, real or complex) arranged in rows and columns, for example:\n", "\n", "\\begin{bmatrix} 10 & 20 & 30 \\\\ 40 & 50 & 60 \\end{bmatrix}\n", "\n", "You can also think of a matrix as a list of vectors: the previous matrix contains either 2 horizontal 3D vectors or 3 vertical 2D vectors.\n", "\n", "Matrices are convenient and very efficient to run operations on many vectors at a time. We will also see that they are great at representing and performing linear transformations such rotations, translations and scaling." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrices in python\n", "In python, a matrix can be represented in various ways. The simplest is just a list of python lists:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[10, 20, 30], [40, 50, 60]]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[\n", " [10, 20, 30],\n", " [40, 50, 60]\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A much more efficient way is to use the NumPy library which provides optimized implementations of many matrix operations:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[10, 20, 30],\n", " [40, 50, 60]])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = np.array([\n", " [10,20,30],\n", " [40,50,60]\n", "])\n", "A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By convention matrices generally have uppercase names, such as $A$.\n", "\n", "In the rest of this tutorial, we will assume that we are using NumPy arrays (type `ndarray`) to represent matrices." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Size\n", "The size of a matrix is defined by its number of rows and number of columns. It is noted $rows \\times columns$. For example, the matrix $A$ above is an example of a $2 \\times 3$ matrix: 2 rows, 3 columns. Caution: a $3 \\times 2$ matrix would have 3 rows and 2 columns.\n", "\n", "To get a matrix's size in NumPy:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2, 3)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Caution**: the `size` attribute represents the number of elements in the `ndarray`, not the matrix's size:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.size" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Element indexing\n", "The number located in the $i^{th}$ row, and $j^{th}$ column of a matrix $X$ is sometimes noted $X_{i,j}$ or $X_{ij}$, but there is no standard notation, so people often prefer to explicitely name the elements, like this: \"*let $X = (x_{i,j})_{1 ≤ i ≤ m, 1 ≤ j ≤ n}$*\". This means that $X$ is equal to:\n", "\n", "$X = \\begin{bmatrix}\n", " x_{1,1} & x_{1,2} & x_{1,3} & \\cdots & x_{1,n}\\\\\n", " x_{2,1} & x_{2,2} & x_{2,3} & \\cdots & x_{2,n}\\\\\n", " x_{3,1} & x_{3,2} & x_{3,3} & \\cdots & x_{3,n}\\\\\n", " \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", " x_{m,1} & x_{m,2} & x_{m,3} & \\cdots & x_{m,n}\\\\\n", "\\end{bmatrix}$\n", "\n", "However in this notebook we will use the $X_{i,j}$ notation, as it matches fairly well NumPy's notation. Note that in math indices generally start at 1, but in programming they usually start at 0. So to access $A_{2,3}$ programmatically, we need to write this:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A[1,2] # 2nd row, 3rd column" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The $i^{th}$ row vector is sometimes noted $M_i$ or $M_{i,*}$, but again there is no standard notation so people often prefer to explicitely define their own names, for example: \"*let **x**$_{i}$ be the $i^{th}$ row vector of matrix $X$*\". We will use the $M_{i,*}$, for the same reason as above. For example, to access $A_{2,*}$ (ie. $A$'s 2nd row vector):" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([40, 50, 60])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A[1, :] # 2nd row vector (as a 1D array)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, the $j^{th}$ column vector is sometimes noted $M^j$ or $M_{*,j}$, but there is no standard notation. We will use $M_{*,j}$. For example, to access $A_{*,3}$ (ie. $A$'s 3rd column vector):" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([30, 60])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A[:, 2] # 3rd column vector (as a 1D array)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the result is actually a one-dimensional NumPy array: there is no such thing as a *vertical* or *horizontal* one-dimensional array. If you need to actually represent a row vector as a one-row matrix (ie. a 2D NumPy array), or a column vector as a one-column matrix, then you need to use a slice instead of an integer when accessing the row or column, for example:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[40, 50, 60]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A[1:2, :] # rows 2 to 3 (excluded): this returns row 2 as a one-row matrix" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[30],\n", " [60]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A[:, 2:3] # columns 3 to 4 (excluded): this returns column 3 as a one-column matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Square, triangular, diagonal and identity matrices\n", "A **square matrix** is a matrix that has the same number of rows and columns, for example a $3 \\times 3$ matrix:\n", "\n", "\\begin{bmatrix}\n", " 4 & 9 & 2 \\\\\n", " 3 & 5 & 7 \\\\\n", " 8 & 1 & 6\n", "\\end{bmatrix}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An **upper triangular matrix** is a special kind of square matrix where all the elements *below* the main diagonal (top-left to bottom-right) are zero, for example:\n", "\n", "\\begin{bmatrix}\n", " 4 & 9 & 2 \\\\\n", " 0 & 5 & 7 \\\\\n", " 0 & 0 & 6\n", "\\end{bmatrix}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, a **lower triangular matrix** is a square matrix where all elements *above* the main diagonal are zero, for example:\n", "\n", "\\begin{bmatrix}\n", " 4 & 0 & 0 \\\\\n", " 3 & 5 & 0 \\\\\n", " 8 & 1 & 6\n", "\\end{bmatrix}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A **triangular matrix** is one that is either lower triangular or upper triangular." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A matrix that is both upper and lower triangular is called a **diagonal matrix**, for example:\n", "\n", "\\begin{bmatrix}\n", " 4 & 0 & 0 \\\\\n", " 0 & 5 & 0 \\\\\n", " 0 & 0 & 6\n", "\\end{bmatrix}\n", "\n", "You can construct a diagonal matrix using NumPy's `diag` function:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[4, 0, 0],\n", " [0, 5, 0],\n", " [0, 0, 6]])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diag([4, 5, 6])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you pass a matrix to the `diag` function, it will happily extract the diagonal values:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 5, 9])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = np.array([\n", " [1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 9],\n", " ])\n", "np.diag(D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, the **identity matrix** of size $n$, noted $I_n$, is a diagonal matrix of size $n \\times n$ with $1$'s in the main diagonal, for example $I_3$:\n", "\n", "\\begin{bmatrix}\n", " 1 & 0 & 0 \\\\\n", " 0 & 1 & 0 \\\\\n", " 0 & 0 & 1\n", "\\end{bmatrix}\n", "\n", "Numpy's `eye` function returns the identity matrix of the desired size:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0., 0.],\n", " [ 0., 1., 0.],\n", " [ 0., 0., 1.]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.eye(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The identity matrix is often noted simply $I$ (instead of $I_n$) when its size is clear given the context. It is called the *identity* matrix because multiplying a matrix with it leaves the matrix unchanged as we will see below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adding matrices\n", "If two matrices $Q$ and $R$ have the same size $m \\times n$, they can be added together. Addition is performed *elementwise*: the result is also a $m \\times n$ matrix $S$ where each element is the sum of the elements at the corresponding position: $S_{i,j} = Q_{i,j} + R_{i,j}$\n", "\n", "$S =\n", "\\begin{bmatrix}\n", " Q_{11} + R_{11} & Q_{12} + R_{12} & Q_{13} + R_{13} & \\cdots & Q_{1n} + R_{1n} \\\\\n", " Q_{21} + R_{21} & Q_{22} + R_{22} & Q_{23} + R_{23} & \\cdots & Q_{2n} + R_{2n} \\\\\n", " Q_{31} + R_{31} & Q_{32} + R_{32} & Q_{33} + R_{33} & \\cdots & Q_{3n} + R_{3n} \\\\\n", " \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", " Q_{m1} + R_{m1} & Q_{m2} + R_{m2} & Q_{m3} + R_{m3} & \\cdots & Q_{mn} + R_{mn} \\\\\n", "\\end{bmatrix}$\n", "\n", "For example, let's create a $2 \\times 3$ matrix $B$ and compute $A + B$:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B = np.array([[1,2,3], [4, 5, 6]])\n", "B" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[10, 20, 30],\n", " [40, 50, 60]])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 22, 33],\n", " [44, 55, 66]])" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A + B" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Addition is *commutative***, meaning that $A + B = B + A$:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 22, 33],\n", " [44, 55, 66]])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B + A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**It is also *associative***, meaning that $A + (B + C) = (A + B) + C$:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[111, 222, 333],\n", " [444, 555, 666]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C = np.array([[100,200,300], [400, 500, 600]])\n", "\n", "A + (B + C)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[111, 222, 333],\n", " [444, 555, 666]])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(A + B) + C" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scalar multiplication\n", "A matrix $M$ can be multiplied by a scalar $\\lambda$. The result is noted $\\lambda M$, and it is a matrix of the same size as $M$ with all elements multiplied by $\\lambda$:\n", "\n", "$\\lambda M =\n", "\\begin{bmatrix}\n", " \\lambda \\times M_{11} & \\lambda \\times M_{12} & \\lambda \\times M_{13} & \\cdots & \\lambda \\times M_{1n} \\\\\n", " \\lambda \\times M_{21} & \\lambda \\times M_{22} & \\lambda \\times M_{23} & \\cdots & \\lambda \\times M_{2n} \\\\\n", " \\lambda \\times M_{31} & \\lambda \\times M_{32} & \\lambda \\times M_{33} & \\cdots & \\lambda \\times M_{3n} \\\\\n", " \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", " \\lambda \\times M_{m1} & \\lambda \\times M_{m2} & \\lambda \\times M_{m3} & \\cdots & \\lambda \\times M_{mn} \\\\\n", "\\end{bmatrix}$\n", "\n", "A more concise way of writing this is:\n", "\n", "$(\\lambda M)_{i,j} = \\lambda (M)_{i,j}$\n", "\n", "In NumPy, simply use the `*` operator to multiply a matrix by a scalar. For example:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 20, 40, 60],\n", " [ 80, 100, 120]])" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Scalar multiplication is also defined on the right hand side, and gives the same result: $M \\lambda = \\lambda M$. For example:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 20, 40, 60],\n", " [ 80, 100, 120]])" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A * 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This makes scalar multiplication **commutative**.\n", "\n", "It is also **associative**, meaning that $\\alpha (\\beta M) = (\\alpha \\times \\beta) M$, where $\\alpha$ and $\\beta$ are scalars. For example:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 60, 120, 180],\n", " [240, 300, 360]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * (3 * A)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 60, 120, 180],\n", " [240, 300, 360]])" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(2 * 3) * A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, it is **distributive over addition** of matrices, meaning that $\\lambda (Q + R) = \\lambda Q + \\lambda R$:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 22, 44, 66],\n", " [ 88, 110, 132]])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * (A + B)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 22, 44, 66],\n", " [ 88, 110, 132]])" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * A + 2 * B" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix multiplication\n", "So far, matrix operations have been rather intuitive. But multiplying matrices is a bit more involved.\n", "\n", "A matrix $Q$ of size $m \\times n$ can be multiplied by a matrix $R$ of size $n \\times q$. It is noted simply $QR$ without multiplication sign or dot. The result $P$ is an $m \\times q$ matrix where each element is computed as a sum of products:\n", "\n", "$P_{i,j} = \\sum_{k=1}^n{Q_{i,k} \\times R_{k,j}}$\n", "\n", "The element at position $i,j$ in the resulting matrix is the sum of the products of elements in row $i$ of matrix $Q$ by the elements in column $j$ of matrix $R$.\n", "\n", "$P =\n", "\\begin{bmatrix}\n", "Q_{11} R_{11} + Q_{12} R_{21} + \\cdots + Q_{1n} R_{n1} &\n", " Q_{11} R_{12} + Q_{12} R_{22} + \\cdots + Q_{1n} R_{n2} &\n", " \\cdots &\n", " Q_{11} R_{1q} + Q_{12} R_{2q} + \\cdots + Q_{1n} R_{nq} \\\\\n", "Q_{21} R_{11} + Q_{22} R_{21} + \\cdots + Q_{2n} R_{n1} &\n", " Q_{21} R_{12} + Q_{22} R_{22} + \\cdots + Q_{2n} R_{n2} &\n", " \\cdots &\n", " Q_{21} R_{1q} + Q_{22} R_{2q} + \\cdots + Q_{2n} R_{nq} \\\\\n", " \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", "Q_{m1} R_{11} + Q_{m2} R_{21} + \\cdots + Q_{mn} R_{n1} &\n", " Q_{m1} R_{12} + Q_{m2} R_{22} + \\cdots + Q_{mn} R_{n2} &\n", " \\cdots &\n", " Q_{m1} R_{1q} + Q_{m2} R_{2q} + \\cdots + Q_{mn} R_{nq}\n", "\\end{bmatrix}$\n", "\n", "You may notice that each element $P_{i,j}$ is the dot product of the row vector $Q_{i,*}$ and the column vector $R_{*,j}$:\n", "\n", "$P_{i,j} = Q_{i,*} \\cdot R_{*,j}$\n", "\n", "So we can rewrite $P$ more concisely as:\n", "\n", "$P =\n", "\\begin{bmatrix}\n", "Q_{1,*} \\cdot R_{*,1} & Q_{1,*} \\cdot R_{*,2} & \\cdots & Q_{1,*} \\cdot R_{*,q} \\\\\n", "Q_{2,*} \\cdot R_{*,1} & Q_{2,*} \\cdot R_{*,2} & \\cdots & Q_{2,*} \\cdot R_{*,q} \\\\\n", "\\vdots & \\vdots & \\ddots & \\vdots \\\\\n", "Q_{m,*} \\cdot R_{*,1} & Q_{m,*} \\cdot R_{*,2} & \\cdots & Q_{m,*} \\cdot R_{*,q}\n", "\\end{bmatrix}$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's multiply two matrices in NumPy, using `ndarray`'s `dot` method:\n", "\n", "$E = AD = \\begin{bmatrix}\n", " 10 & 20 & 30 \\\\\n", " 40 & 50 & 60\n", "\\end{bmatrix} \n", "\\begin{bmatrix}\n", " 2 & 3 & 5 & 7 \\\\\n", " 11 & 13 & 17 & 19 \\\\\n", " 23 & 29 & 31 & 37\n", "\\end{bmatrix} = \n", "\\begin{bmatrix}\n", " 930 & 1160 & 1320 & 1560 \\\\\n", " 2010 & 2510 & 2910 & 3450\n", "\\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 930, 1160, 1320, 1560],\n", " [2010, 2510, 2910, 3450]])" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = np.array([\n", " [ 2, 3, 5, 7],\n", " [11, 13, 17, 19],\n", " [23, 29, 31, 37]\n", " ])\n", "E = A.dot(D)\n", "E" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check this result by looking at one element, just to be sure: looking at $E_{2,3}$ for example, we need to multiply elements in $A$'s $2^{nd}$ row by elements in $D$'s $3^{rd}$ column, and sum up these products:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2910" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "40*5 + 50*17 + 60*31" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2910" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E[1,2] # row 2, column 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks good! You can check the other elements until you get used to the algorithm.\n", "\n", "We multiplied a $2 \\times 3$ matrix by a $3 \\times 4$ matrix, so the result is a $2 \\times 4$ matrix. The first matrix's number of columns has to be equal to the second matrix's number of rows. If we try to multiply $D$ by $A$, we get an error because D has 4 columns while A has 2 rows:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ValueError: shapes (3,4) and (2,3) not aligned: 4 (dim 1) != 2 (dim 0)\n" ] } ], "source": [ "try:\n", " D.dot(A)\n", "except ValueError as e:\n", " print(\"ValueError:\", e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This illustrates the fact that **matrix multiplication is *NOT* commutative**: in general $QR ≠ RQ$\n", "\n", "In fact, $QR$ and $RQ$ are only *both* defined if $Q$ has size $m \\times n$ and $R$ has size $n \\times m$. Let's look at an example where both *are* defined and show that they are (in general) *NOT* equal:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[400, 130],\n", " [940, 310]])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F = np.array([\n", " [5,2],\n", " [4,1],\n", " [9,3]\n", " ])\n", "A.dot(F)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[130, 200, 270],\n", " [ 80, 130, 180],\n", " [210, 330, 450]])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F.dot(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the other hand, **matrix multiplication *is* associative**, meaning that $Q(RS) = (QR)S$. Let's create a $4 \\times 5$ matrix $G$ to illustrate this:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[21640, 28390, 27320, 31140, 13570],\n", " [47290, 62080, 60020, 68580, 29500]])" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = np.array([\n", " [8, 7, 4, 2, 5],\n", " [2, 5, 1, 0, 5],\n", " [9, 11, 17, 21, 0],\n", " [0, 1, 0, 1, 2]])\n", "A.dot(D).dot(G) # (AB)G" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[21640, 28390, 27320, 31140, 13570],\n", " [47290, 62080, 60020, 68580, 29500]])" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.dot(D.dot(G)) # A(BG)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also ***distributive* over addition** of matrices, meaning that $(Q + R)S = QS + RS$. For example:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1023, 1276, 1452, 1716],\n", " [2211, 2761, 3201, 3795]])" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(A + B).dot(D)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1023, 1276, 1452, 1716],\n", " [2211, 2761, 3201, 3795]])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.dot(D) + B.dot(D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The product of a matrix $M$ by the identity matrix (of matching size) results in the same matrix $M$. More formally, if $M$ is an $m \\times n$ matrix, then:\n", "\n", "$M I_n = I_m M = M$\n", "\n", "This is generally written more concisely (since the size of the identity matrices is unambiguous given the context):\n", "\n", "$MI = IM = M$\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 10., 20., 30.],\n", " [ 40., 50., 60.]])" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.dot(np.eye(3))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 10., 20., 30.],\n", " [ 40., 50., 60.]])" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.eye(2).dot(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Caution**: NumPy's `*` operator performs elementwise multiplication, *NOT* a matrix multiplication:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([[ 10, 40, 90],\n", " [160, 250, 360]])" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A * B # NOT a matrix multiplication" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**The @ infix operator**\n", "\n", "Python 3.5 [introduced](https://docs.python.org/3/whatsnew/3.5.html#pep-465-a-dedicated-infix-operator-for-matrix-multiplication) the `@` infix operator for matrix multiplication, and NumPy 1.10 added support for it. If you are using Python 3.5+ and NumPy 1.10+, you can simply write `A @ D` instead of `A.dot(D)`, making your code much more readable (but less portable). This operator also works for vector dot products." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python version: 3.5.3\n", "Numpy version: 1.12.1\n" ] } ], "source": [ "import sys\n", "print(\"Python version: {}.{}.{}\".format(*sys.version_info))\n", "print(\"Numpy version:\", np.version.version)\n", "\n", "# Uncomment the following line if your Python version is ≥3.5\n", "# and your NumPy version is ≥1.10:\n", "\n", "#A @ D" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: `Q @ R` is actually equivalent to `Q.__matmul__(R)` which is implemented by NumPy as `np.matmul(Q, R)`, not as `Q.dot(R)`. The main difference is that `matmul` does not support scalar multiplication, while `dot` does, so you can write `Q.dot(3)`, which is equivalent to `Q * 3`, but you cannot write `Q @ 3` ([more details](http://stackoverflow.com/a/34142617/38626))." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix transpose\n", "The transpose of a matrix $M$ is a matrix noted $M^T$ such that the $i^{th}$ row in $M^T$ is equal to the $i^{th}$ column in $M$:\n", "\n", "$ A^T =\n", "\\begin{bmatrix}\n", " 10 & 20 & 30 \\\\\n", " 40 & 50 & 60\n", "\\end{bmatrix}^T =\n", "\\begin{bmatrix}\n", " 10 & 40 \\\\\n", " 20 & 50 \\\\\n", " 30 & 60\n", "\\end{bmatrix}$\n", "\n", "In other words, ($A^T)_{i,j}$ = $A_{j,i}$\n", "\n", "Obviously, if $M$ is an $m \\times n$ matrix, then $M^T$ is an $n \\times m$ matrix.\n", "\n", "Note: there are a few other notations, such as $M^t$, $M′$, or ${^t}M$.\n", "\n", "In NumPy, a matrix's transpose can be obtained simply using the `T` attribute:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[10, 20, 30],\n", " [40, 50, 60]])" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[10, 40],\n", " [20, 50],\n", " [30, 60]])" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you might expect, transposing a matrix twice returns the original matrix:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[10, 20, 30],\n", " [40, 50, 60]])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.T.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Transposition is distributive over addition of matrices, meaning that $(Q + R)^T = Q^T + R^T$. For example:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 44],\n", " [22, 55],\n", " [33, 66]])" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(A + B).T" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 44],\n", " [22, 55],\n", " [33, 66]])" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.T + B.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Moreover, $(Q \\cdot R)^T = R^T \\cdot Q^T$. Note that the order is reversed. For example:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 930, 2010],\n", " [1160, 2510],\n", " [1320, 2910],\n", " [1560, 3450]])" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(A.dot(D)).T" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 930, 2010],\n", " [1160, 2510],\n", " [1320, 2910],\n", " [1560, 3450]])" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D.T.dot(A.T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A **symmetric matrix** $M$ is defined as a matrix that is equal to its transpose: $M^T = M$. This definition implies that it must be a square matrix whose elements are symmetric relative to the main diagonal, for example:\n", "\n", "\\begin{bmatrix}\n", " 17 & 22 & 27 & 49 \\\\\n", " 22 & 29 & 36 & 0 \\\\\n", " 27 & 36 & 45 & 2 \\\\\n", " 49 & 0 & 2 & 99\n", "\\end{bmatrix}\n", "\n", "The product of a matrix by its transpose is always a symmetric matrix, for example:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 87, 279, 547],\n", " [ 279, 940, 1860],\n", " [ 547, 1860, 3700]])" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D.dot(D.T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Converting 1D arrays to 2D arrays in NumPy\n", "As we mentionned earlier, in NumPy (as opposed to Matlab, for example), 1D really means 1D: there is no such thing as a vertical 1D-array or a horizontal 1D-array. So you should not be surprised to see that transposing a 1D array does not do anything:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2, 5])" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2, 5])" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to convert $\\textbf{u}$ into a row vector before transposing it. There are a few ways to do this:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 5]])" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u_row = np.array([u])\n", "u_row" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice the extra square brackets: this is a 2D array with just one row (ie. a 1x2 matrix). In other words it really is a **row vector**." ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 5]])" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u[np.newaxis, :]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is quite explicit: we are asking for a new vertical axis, keeping the existing data as the horizontal axis." ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 5]])" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u[np.newaxis]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is equivalent, but a little less explicit." ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 5]])" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u[None]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the shortest version, but you probably want to avoid it because it is unclear. The reason it works is that `np.newaxis` is actually equal to `None`, so this is equivalent to the previous version.\n", "\n", "Ok, now let's transpose our row vector:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2],\n", " [5]])" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u_row.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Great! We now have a nice **column vector**.\n", "\n", "Rather than creating a row vector then transposing it, it is also possible to convert a 1D array directly into a column vector:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2],\n", " [5]])" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u[:, np.newaxis]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting a matrix\n", "We have already seen that vectors can be represented as points or arrows in N-dimensional space. Is there a good graphical representation of matrices? Well you can simply see a matrix as a list of vectors, so plotting a matrix results in many points or arrows. For example, let's create a $2 \\times 4$ matrix `P` and plot it as points:" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "P = np.array([\n", " [3.0, 4.0, 1.0, 4.6],\n", " [0.2, 3.5, 2.0, 0.5]\n", " ])\n", "x_coords_P, y_coords_P = P\n", "plt.scatter(x_coords_P, y_coords_P)\n", "plt.axis([0, 5, 0, 4])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course we could also have stored the same 4 vectors as row vectors instead of column vectors, resulting in a $4 \\times 2$ matrix (the transpose of $P$, in fact). It is really an arbitrary choice.\n", "\n", "Since the vectors are ordered, you can see the matrix as a path and represent it with connected dots:" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n4TjnLfdIPwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x_coords_P, y_coords_P, \"bo\")\n", "plt.plot(x_coords_P, y_coords_P, \"b--\")\n", "plt.axis([0, 5, 0, 4])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or you can represent it as a polygon: matplotlib's `Polygon` class expects an $n \\times 2$ NumPy array, not a $2 \\times n$ array, so we just need to give it $P^T$:" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.patches import Polygon\n", "plt.gca().add_artist(Polygon(P.T))\n", "plt.axis([0, 5, 0, 4])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Geometric applications of matrix operations\n", "We saw earlier that vector addition results in a geometric translation, vector multiplication by a scalar results in rescaling (zooming in or out, centered on the origin), and vector dot product results in projecting a vector onto another vector, rescaling and measuring the resulting coordinate.\n", "\n", "Similarly, matrix operations have very useful geometric applications." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Addition = multiple geometric translations\n", "First, adding two matrices together is equivalent to adding all their vectors together. For example, let's create a $2 \\times 4$ matrix $H$ and add it to $P$, and look at the result:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nQjfGmATxf0KNOgvBmMdIAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "H = np.array([\n", " [ 0.5, -0.2, 0.2, -0.1],\n", " [ 0.4, 0.4, 1.5, 0.6]\n", " ])\n", "P_moved = P + H\n", "\n", "plt.gca().add_artist(Polygon(P.T, alpha=0.2))\n", "plt.gca().add_artist(Polygon(P_moved.T, alpha=0.3, color=\"r\"))\n", "for vector, origin in zip(H.T, P.T):\n", " plot_vector2d(vector, origin=origin)\n", "\n", "plt.text(2.2, 1.8, \"$P$\", color=\"b\", fontsize=18)\n", "plt.text(2.0, 3.2, \"$P+H$\", color=\"r\", fontsize=18)\n", "plt.text(2.5, 0.5, \"$H_{*,1}$\", color=\"k\", fontsize=18)\n", "plt.text(4.1, 3.5, \"$H_{*,2}$\", color=\"k\", fontsize=18)\n", "plt.text(0.4, 2.6, \"$H_{*,3}$\", color=\"k\", fontsize=18)\n", "plt.text(4.4, 0.2, \"$H_{*,4}$\", color=\"k\", fontsize=18)\n", "\n", "plt.axis([0, 5, 0, 4])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we add a matrix full of identical vectors, we get a simple geometric translation:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "H2 = np.array([\n", " [-0.5, -0.5, -0.5, -0.5],\n", " [ 0.4, 0.4, 0.4, 0.4]\n", " ])\n", "P_translated = P + H2\n", "\n", "plt.gca().add_artist(Polygon(P.T, alpha=0.2))\n", "plt.gca().add_artist(Polygon(P_translated.T, alpha=0.3, color=\"r\"))\n", "for vector, origin in zip(H2.T, P.T):\n", " plot_vector2d(vector, origin=origin)\n", "\n", "plt.axis([0, 5, 0, 4])\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although matrices can only be added together if they have the same size, NumPy allows adding a row vector or a column vector to a matrix: this is called *broadcasting* and is explained in further details in the [NumPy tutorial](tools_numpy.ipynb). We could have obtained the same result as above with:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 2.5, 3.5, 0.5, 4.1],\n", " [ 0.6, 3.9, 2.4, 0.9]])" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P + [[-0.5], [0.4]] # same as P + H2, thanks to NumPy broadcasting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Scalar multiplication\n", "Multiplying a matrix by a scalar results in all its vectors being multiplied by that scalar, so unsurprisingly, the geometric result is a rescaling of the entire figure. For example, let's rescale our polygon by a factor of 60% (zooming out, centered on the origin):" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_transformation(P_before, P_after, text_before, text_after, axis = [0, 5, 0, 4], arrows=False):\n", " if arrows:\n", " for vector_before, vector_after in zip(P_before.T, P_after.T):\n", " plot_vector2d(vector_before, color=\"blue\", linestyle=\"--\")\n", " plot_vector2d(vector_after, color=\"red\", linestyle=\"-\")\n", " plt.gca().add_artist(Polygon(P_before.T, alpha=0.2))\n", " plt.gca().add_artist(Polygon(P_after.T, alpha=0.3, color=\"r\"))\n", " plt.text(P_before[0].mean(), P_before[1].mean(), text_before, fontsize=18, color=\"blue\")\n", " plt.text(P_after[0].mean(), P_after[1].mean(), text_after, fontsize=18, color=\"red\")\n", " plt.axis(axis)\n", " plt.grid()\n", "\n", "P_rescaled = 0.60 * P\n", "plot_transformation(P, P_rescaled, \"$P$\", \"$0.6 P$\", arrows=True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Matrix multiplication – Projection onto an axis\n", "Matrix multiplication is more complex to visualize, but it is also the most powerful tool in the box.\n", "\n", "Let's start simple, by defining a $1 \\times 2$ matrix $U = \\begin{bmatrix} 1 & 0 \\end{bmatrix}$. This row vector is just the horizontal unit vector." ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [ "U = np.array([[1, 0]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's look at the dot product $U \\cdot P$:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 3. , 4. , 1. , 4.6]])" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.dot(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are the horizontal coordinates of the vectors in $P$. In other words, we just projected $P$ onto the horizontal axis:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_projection(U, P):\n", " U_P = U.dot(P)\n", " \n", " axis_end = 100 * U\n", " plot_vector2d(axis_end[0], color=\"black\")\n", "\n", " plt.gca().add_artist(Polygon(P.T, alpha=0.2))\n", " for vector, proj_coordinate in zip(P.T, U_P.T):\n", " proj_point = proj_coordinate * U\n", " plt.plot(proj_point[0][0], proj_point[0][1], \"ro\")\n", " plt.plot([vector[0], proj_point[0][0]], [vector[1], proj_point[0][1]], \"r--\")\n", "\n", " plt.axis([0, 5, 0, 4])\n", " plt.grid()\n", " plt.show()\n", "\n", "plot_projection(U, P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can actually project on any other axis by just replacing $U$ with any other unit vector. For example, let's project on the axis that is at a 30° angle above the horizontal axis:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "angle30 = 30 * np.pi / 180 # angle in radians\n", "U_30 = np.array([[np.cos(angle30), np.sin(angle30)]])\n", "\n", "plot_projection(U_30, P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Good! Remember that the dot product of a unit vector and a matrix basically performs a projection on an axis and gives us the coordinates of the resulting points on that axis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Matrix multiplication – Rotation\n", "Now let's create a $2 \\times 2$ matrix $V$ containing two unit vectors that make 30° and 120° angles with the horizontal axis:\n", "\n", "$V = \\begin{bmatrix} \\cos(30°) & \\sin(30°) \\\\ \\cos(120°) & \\sin(120°) \\end{bmatrix}$" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.8660254, 0.5 ],\n", " [-0.5 , 0.8660254]])" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle120 = 120 * np.pi / 180\n", "V = np.array([\n", " [np.cos(angle30), np.sin(angle30)],\n", " [np.cos(angle120), np.sin(angle120)]\n", " ])\n", "V" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the product $VP$:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 2.69807621, 5.21410162, 1.8660254 , 4.23371686],\n", " [-1.32679492, 1.03108891, 1.23205081, -1.8669873 ]])" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "V.dot(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first row is equal to $V_{1,*} P$, which is the coordinates of the projection of $P$ onto the 30° axis, as we have seen above. The second row is $V_{2,*} P$, which is the coordinates of the projection of $P$ onto the 120° axis. So basically we obtained the coordinates of $P$ after rotating the horizontal and vertical axes by 30° (or equivalently after rotating the polygon by -30° around the origin)! Let's plot $VP$ to see this:" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ngP8PoIfUTdnslWoAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "P_rotated = V.dot(P)\n", "plot_transformation(P, P_rotated, \"$P$\", \"$VP$\", [-2, 6, -2, 4], arrows=True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matrix $V$ is called a **rotation matrix**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Matrix multiplication – Other linear transformations\n", "More generally, any linear transformation $f$ that maps n-dimensional vectors to m-dimensional vectors can be represented as an $m \\times n$ matrix. For example, say $\\textbf{u}$ is a 3-dimensional vector:\n", "\n", "$\\textbf{u} = \\begin{pmatrix} x \\\\ y \\\\ z \\end{pmatrix}$\n", "\n", "and $f$ is defined as:\n", "\n", "$f(\\textbf{u}) = \\begin{pmatrix}\n", "ax + by + cz \\\\\n", "dx + ey + fz\n", "\\end{pmatrix}$\n", "\n", "This transormation $f$ maps 3-dimensional vectors to 2-dimensional vectors in a linear way (ie. the resulting coordinates only involve sums of multiples of the original coordinates). We can represent this transformation as matrix $F$:\n", "\n", "$F = \\begin{bmatrix}\n", "a & b & c \\\\\n", "d & e & f\n", "\\end{bmatrix}$\n", "\n", "Now, to compute $f(\\textbf{u})$ we can simply do a matrix multiplication:\n", "\n", "$f(\\textbf{u}) = F \\textbf{u}$\n", "\n", "If we have a matric $G = \\begin{bmatrix}\\textbf{u}_1 & \\textbf{u}_2 & \\cdots & \\textbf{u}_q \\end{bmatrix}$, where each $\\textbf{u}_i$ is a 3-dimensional column vector, then $FG$ results in the linear transformation of all vectors $\\textbf{u}_i$ as defined by the matrix $F$:\n", "\n", "$FG = \\begin{bmatrix}f(\\textbf{u}_1) & f(\\textbf{u}_2) & \\cdots & f(\\textbf{u}_q) \\end{bmatrix}$\n", "\n", "To summarize, the matrix on the left hand side of a dot product specifies what linear transormation to apply to the right hand side vectors. We have already shown that this can be used to perform projections and rotations, but any other linear transformation is possible. For example, here is a transformation known as a *shear mapping*:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_shear = np.array([\n", " [1, 1.5],\n", " [0, 1]\n", " ])\n", "plot_transformation(P, F_shear.dot(P), \"$P$\", \"$F_{shear} P$\",\n", " axis=[0, 10, 0, 7])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at how this transformation affects the **unit square**: " ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Square = np.array([\n", " [0, 0, 1, 1],\n", " [0, 1, 1, 0]\n", " ])\n", "plot_transformation(Square, F_shear.dot(Square), \"$Square$\", \"$F_{shear} Square$\",\n", " axis=[0, 2.6, 0, 1.8])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's look at a **squeeze mapping**:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nIYTD/X89xnDf72x6IwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_squeeze = np.array([\n", " [1.4, 0],\n", " [0, 1/1.4]\n", " ])\n", "plot_transformation(P, F_squeeze.dot(P), \"$P$\", \"$F_{squeeze} P$\",\n", " axis=[0, 7, 0, 5])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The effect on the unit square is:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8XHW9//HXJ0mTJumabtAGGrovtJZSoHhZwiYFkYKi\nUhcEEUHFn9wLAlf9URB/KperoKAoXrSIYkHhR7Eiiy1BSgu0tGlrt3RLl3Sha0rbJE3S7/3jTPZJ\nc9LMZL7MvJ+PBw9yzpyceTMTPjl5z5kz5pxDRESSU1qiA4iISPxoyIuIJDENeRGRJKYhLyKSxDTk\nRUSSmIa8iEgS05AXEUliGvIiIklMQ15EJIlpyIuIJDENeRGRJJbRmXdmZrpQjojIcXDO2fF8X6cf\nyTvnvPpn+vTpCc/wYcmlTMqUCrl8zNQRKV/XlJaWJjpCVD7mUqZwlCk8H3P5mKkjUn7Ii4gks5Qf\n8tdff32iI0TlYy5lCkeZwvMxl4+ZOsI62ve0687MXGfen4hIMjAz3IflhVffFBUVJTpCVD7mUqZw\nlCk8H3P5mKkjUn7Ii4gkM9U1IiKeU10jIiJRpfyQ97V/8zGXMoWjTOH5mMvHTB2R8kNeRCSZqZMX\nEfGcOnkREYkq5Ye8r/2bj7mUKRxlCs/HXD5m6oiUH/IiIslMnbyIiOfUyYuISFQpP+R97d98zKVM\n4ShTeD7m8jFTR6T8kBcRSWbq5EVEPKdOXkREokr5Ie9r/+ZjLmUKR5nC8zGXj5k6IuWHvIhIMlMn\nLyLiOXXyIiISVcoPeV/7Nx9zKVM4yhSej7l8zNQRKT/kRUSSmTp5ERHPqZMXEZGoUn7I+9q/+ZhL\nmcJRpvB8zOVjpo5I+SEvIpLM2uzkzewJ4Apgp3NufCvb/By4DDgEXO+cK25lO3XyIiLtFO9O/nfA\npce488uAoc654cDNwK+OJ4iIiMRem0PeOTcP2HeMTaYCv49s+w7Q08wGxCZe/Pnav/mYS5nCUabw\nfMzlY6aOiEUnPwjY0mi5LLJOREQSLNR58mY2GPhrtE7ezGYDP3TOzY8s/wP4tnNuSZRt1cmLiLRT\nRzr5jBjc/1bgpEbL+cC21ja+5JIrGDBgIAC5ud0YOnQk48dPAmDZskUAWtbyh3r5vPM+yuTJ4+r/\n7C8sLATQspZDLxcVFTFjxgwACgoK6IiwR/IFBEfy46LcdjnwDefcx81sMvCwc25yK/txixb5dSS/\naFERkyYVJjpGCz7mUqZw5sz5NXfeeXOiYzRRVFRUP0x84mMuHzPF9UjezJ4GCoE+ZrYZmA5kAs45\n97hz7iUzu9zM1hGcQnnD8QQREZHY6/Rr1/h2JC8Sa7t2vceUKacnOoYkEV27RkREokr5Ib9oUVGi\nI0TlYy5lCqfuBVif+Hrut4+5fMzUESk/5EVEkpk6eZEYUycvsaZOXkREokr5Ie9jpwt+5lKmcNTJ\nh+djLh8zdUTKD3kRkWSmTl4kxtTJS6ypkxcRkahSfsj72OmCn7mUKRx18uH5mMvHTB2R8kNeRCSZ\nqZMXiTF18hJr6uRFRCSqlB/yPna64GcuZQpHnXx4PubyMVNHpPyQFxFJZurkRWJMnbzEmjp5ERGJ\nKuWHvI+dLviZS5nCUScfno+5fMzUESk/5EVEkpk6eZEYUycvsaZOXkREokr5Ie9jpwt+5lKmcNTJ\nh+djLh8zdUTKD3kRkWSmTl4kxtTJS6ypkxcRkahSfsj72OmCn7mUKRx18uH5mMvHTB2R8kNeRCSZ\nqZMXiTF18hJr6uRFRCSqUEPezKaY2WozKzGzu6LcfpKZzTWzxWZWbGaXxT5qfPjY6YKfuZQpHHXy\n4fmYy8dMHdHmkDezNOBR4FJgLDDNzEY12+x7wDPOuYnANOCXsQ4qIiLt12Ynb2aTgenOucsiy3cD\nzjn3QKNtHgM2OOceNLOzgQedc+dE2Zc6eUl66uQl1jrSyWeE2GYQsKXR8lbgzGbb3Ae8amb/B8gB\nLj6eMCIiElthhny03x7ND8enAb9zzj0UOfL/A0G108L06dczcGABAN269WLkyAlMmlQINPSrnbm8\nZk0xn//8bQm7/9aWG3fNPuQB+OMfH07489V82cfnr7x8DVOmnF7f7RYWBrcncrlxz+xDnrrl4uJi\nbrvtNm/y1Gn8mCXq+ZoxYwYABQUFdETYuuZe59yUyHK0uuZfwKXOubLI8nrgLOfc7mb78q6uWbSo\nqP5/Up/4mEuZwpkz59fceefNiY7RRFFRUf0w8YmPuXzM1JG6JsyQTwfWABcB24F3gWnOuVWNtvkb\n8Kxz7kkzGw285pzLj7Iv74a8SKypk5dYi+t58s65WuBW4FVgBTDTObfKzO4zsysim90B3GRmxcAf\ngS8dTxgREYmtUOfJO+deds6NdM4Nd879OLJuunNuduTrVc65c5xzE5xzE51zc+IZOpZ8PM8a/Myl\nTOHoPPnwfMzlY6aO0DteRUSSmK5dIxJj6uQl1nTtGhERiSrlh7yPnS74mUuZwlEnH56PuXzM1BEp\nP+RFRJKZOnmRGFMnL7GmTl5ERKJK+SHvY6cLfuZSpnDUyYfnYy4fM3VEyg95EZFkpk5eJMbUyUus\nqZMXEZGowlxPPqb6/uWxzr7LY1qwqYSzB49IdIwWfMylTOEsW/0mbDw30TGaKCopoXCEX48TQNGu\nXRTec0+iYzTh46WGO6LTh3x1/xZXIE6o2gP7vMsEfuZSpnCObO8N+X5lYt8+/zIBlJQkOkHS6/RO\nfu1PX+y0+xNJhPLydZx++rBEx/hw2LoVvva1RKfwnjp5ERGJKuWH/Dvrlic6QlQ+5lKmcBaVrkt0\nhBaKlvv3OEHwWoFvdJ68iIh8aKiTF4kxdfLtoE4+FHXyIiISVcoPeR87XfAzlzKFo04+PHXy8Zfy\nQ15EJJmpkxeJMXXy7aBOPhR18iIiElXKD3kfO13wM5cyhaNOPjx18vGX8kNeRCSZqZMXiTF18u2g\nTj4UdfIiIhJVyg95Hztd8DOXMoWjTj48dfLxF2rIm9kUM1ttZiVmdlcr23zGzFaY2XIz+0NsY4qI\nyPFos5M3szSgBLgI2AYsBK51zq1utM0w4BngAufcATPr65zbHWVf6uQl6amTbwd18qHEu5M/E1jr\nnNvknKsGZgJTm21zE/AL59wBgGgDXkREOl+YIT8I2NJoeWtkXWMjgJFmNs/M5pvZpbEKGG8+drrg\nZy5lCkedfHjq5OMvzGe8RvsToXnHkwEMA84DTgbeNLOxdUf2jd359MPk5/UHoHt2LmMGDeGsYeOA\nhv9hO3N5ZdmGhN7/h2l5ZdkGr/L4+vzVqRushePGabmV5eItWyise7wiw7XuQ7QTtVwnkXmKioqY\nMWMGAAUFBXREmE5+MnCvc25KZPluwDnnHmi0zWPAAufc7yPL/wDucs6912xf6uQl6amTbwd18qHE\nu5NfCAwzs8FmlglcCzSf1C8AF0bC9AWGAxuOJ5CIiMROm0PeOVcL3Aq8CqwAZjrnVpnZfWZ2RWSb\nV4A9ZrYCmAPc4ZzbF8fcMeNjpwt+5lKmcNTJh6dOPv7CdPI4514GRjZbN73Z8u3A7bGLJiIiHaVr\n14jEmDr5dlAnH4quXSMiIlGl/JD3sdOF+Od67t187vjjadz//8cy/S/j+PWcYaws68HDfx/Z6vf4\n+Fj5mEmdfHjq5OMvVCcvyeXOpydwQq8K/vvzS+rXFa3sz7WP/BsPf/G9Y3yniHzYqJNPMbPeG8T/\nzB3KX7/9zxa3XfzDC5h1+z/JzapNQLLkoU6+HdTJh6JOXkJ7ddmJDMqriHrbmUP3aMCLJJmUr2ve\nWbe8/m3pPolXrtysGmYvGcRTbxZw+Wnb6NPtSP1t37tqRf3XByvT+fkrI8nJrKWm1pjyke384IUB\nPHnLOopW9Wftju4sKc3jp19YTM+cagBeKj6RFxbl8/hXFkbdT3WtMeKED3jijaG8eHvwl8Tv3jiF\n0l3d2FHelU9MLOO9DXmsKOvJxIJ93H3lSgCqatL4n9eHUn64C3m5R9hR3pXbP76a7l1rvHz+FpX6\ndyRftHx5/eUEfFJUUlJ/WQNfFBUV1V9qIBnoSD7F3HLxWvJyq/jBC6dy9vSPcemPL+CRV4ZTVZ1G\nTuQo/lBVOtc99lFO6FnJbZet4Y4rVvOjF8ew60Av9h/uQtneHG792Fq27s3m3fV96vf9UvFAcrNq\n6pcPV6XzpcfOrt/Pt69YzZ8WFJBuQUW4dkc3euVUc9OF63h95QAWlPRl+qf+RU5mLbsOZNVnmfbI\nv9G1Sy3fmbqSWy5ex9nDd/POuj6ISNtS/kjet6PAOvHKNaT/IeZ8dy5vrOrP2+v6Mm9NPx55dSQ7\ny7P5wWeWAfCTv42isjqNLxc2XJkiPc1x/ujDvFXSj0+esYXV27qzeXcu409ueGPzog19uP3yVfXL\nP3lpFBXV6U32k5VRy4TBewEoP5zJx8ZvZ35JP3Iya/ne1cFfEjNuebt++x/NGsvBygxujOxj14Es\n5q4YwLevCO7Hx+dvUoFfR/GAl0fxAIUjRiQ6QgvJdBQPGvIp5XBVOjlZtWR1OcrHxu/gY+N3APD1\n307ilWUn8oPPLOODigz+/M5gvn5Jw6ltR2qM4k29ufbsTVw+YTsAv3htBJOH72ZAzyogOCrfdyiT\nycODjxL4oCKDZ99uup/qWmPJpt7ccH4wsCcNCYb92+v6MLFgL9mZTV8P+KAygxcW5XPm0D38Zu5Q\nao4auVk1/OeVK+mVWx2nR0kkuaR8XePjedYQ+1xle7N5ev7gqLd9dMTu+prlvY15HKlJY/Kwhs99\nKd7Um6rqdNLsrfp1Ly87kSnjt9cvL9zQh4G9KzipT/Ci7uLSlvtZuqk3NbVpTBqyp8n9v722L2cN\na/k5M6W7cjlSm8bNF63jpgvX87WL13HduaVNBryPz5/Okw9P58nHX8oP+VTxVkk/ao9Gf7r/ubof\nnzpzMwBHaoJthp/wQf3tb6/tS37eYXrnHgKg/HAXdpZ3ZfzJ++u3Wbg+r36gP/aPYVRVR9nPuj6M\nGVROt661/HrOUAD2HMxk3c7uTB7WdPBD8CKxAX27V7W4bc227qH/20VSWcoPeR87XYh9rvklfXl+\nYT5b9mTXr3OO4EXXmnRuuTg4+pxQsI/MjKMcPhI0eSvLevDkm6dwxtA99Zm6ZtaSmX4Ui7yAuvH9\nXN4q6c+IEw+wdW82eblHOK1gH1ldapvs57l3T2bUwAMcqTGqqtOB4BdITlYN405q+IVRZ0j/Q4wZ\nVE7JjoaBXlNrPPLKcPYfzozL4xQL6uTDUycff+rkU4XB77+2gEdeGcnBygwyuxzlUGUGpxXs5bdf\nfZv0yK/7/j2q+PG1xTw4ezQF/Q6Rm1VDVXV6fX8OkJVxlO9/ehm/eG0EYwaV06fbEe7/9FL+8u7J\n7Czvyh0fX01GuuOBacX89+zRDO53iB5dq/nFDQv5r7+O4cHZY/hy4XoAyvZl8/EJ20hr5XDj0esX\n8eDs0azb0Z20NMfRo3D1GVvJb+VcfxFpKuXf8erjedbgT64VW3vwyYfO49W757Kj/B0vMjXmy+PU\n2JylL3Pzp6YkOkYT3p4nP3cuhQ89lOgYTfh4nrze8Spxs3xLL/p0q2Jwv8OJjiIixyHlj+Tl2O78\n0wQqjqTzyJd04bKwdO2adtC1a0LRkbzE3KqyHtzyxBnMXjyQZZt78cNZYxIdSUSOQ8oPeR/Ps4bE\n5xo96AC/unEhKx98iTf+7xy+M3VlwjNF42MmnScfns6Tj7+UH/IiIslMnbxIjKmTbwd18qGokxcR\nkahSfsj72OmCn7mUKRx18uGpk4+/lB/yIiLJTJ28SIypk28HdfKhqJMXEZGoUn7I+9jpgp+5lCkc\ndfLhqZOPv5Qf8iIiySxUJ29mU4CHCX4pPOGce6CV7a4BngUmOecWR7ldnby0kFW6ml5vzCJnzRLS\nqo9wcNzZuPR0MMNqqumyZwdZW9eze+pXKD/vE4mO26YWnfycObB0KXTvDjU10K8fTJwICxbA5z+f\nuKA+UCcfSkc6+TavJ29macCjwEXANmChmc1yzq1utl034JvA2y33ItK6qoJR7CwYxeD/91UqBhaw\n87pvt9im359/SU3PPglI10EPPRQM9f/4j4Z1ixbBXXfBnXcmLpekjDB1zZnAWufcJudcNTATmBpl\nu/uBB4CWn9XmMR87XfAzVzwzZex9n4y9Ozk8elLU26tOGkZ1nwGdmul41XfyRUWwcSN84QtNN5g0\nCfLy4NRTOy2TOvnwUrGTHwRsabS8NbKunplNAPKdcy/FMJukkOy1SwHj0KiJ9etylzZ8cHhNzz5U\n9xuYgGQdsGAB9O8f/bZTT4Xs7Oi3icRQmI//i9YD1Rf5ZmbAQ8CX2vgeAO58+mHy84If/O7ZuYwZ\nNKT+k33qjso6e7lOou4/2vJZw8Z5lafxYxSP/WevW055737M372ds3r1Je3gAWr++SLv5PbgrGHj\nODz69A/N81f3Ga87Kivpv2wZabNnw7nnUrQ5+LD0wnHj4Kab6o+uC4cOhT/9idIDB7DaWgZfdRU8\n8wz/vOwy8kpKOBVg9WrmXX45NdnZwffPm8fuWbP413XX1X/iU9Hy5aRXVXHu0qXQtSubt2/n0IAB\njF60iMKf/Yyi5cvJf+sthjkHe/aw8pRT6FlayqDychg1iqIzzgjyjBoFzz/PltJSqnNzGZKRAddd\nR9H69Q35afjroKPLdeqOoOs+lSmVl4uKipgxYwYABQUFdESbL7ya2WTgXufclMjy3YCre/HVzHoA\n64CDBMP9BGAPcGXzF1/1wqu0puC+G6jNzqXq5OGkVRwiZ00xB866hN1X35ToaO1W/8Lr1q3wve/B\n/v3Bp6YPHAjnnw+f/CRkBh9ETkUFfPe7cN55cNVVwbrvfAcOHYJ77oE33wzWf/3rcN11MHlysM2P\nfwwZGXDHHQ13XFkZ7Ovccxv2ddddUF0NP/0pbN4M69bB2LHw1a/CJZfArbcG99OzJ9x+e0Oec8+F\nq68O9jF/PqSlNdx3LOmF11Di/WaohcAwMxtsZpnAtUD9pHbOHXDO9XfODXHOnULwwusnop1d4yMf\nO13wM1e8MnV5v4z0A3vZe+nneP/ab7Hjhu+w99JpVIT47FYfH6f6Tj4/Hx5/PBi0l18erPvTn+A3\nv2nY+Kmn4MiRhqEMwUAdMwaKi+Gii4Jef/t2GD68YZsVK2D8+KZ3/NRTUFXVdF+ZmTBuXHDUfPAg\nnH12sL+uXeGmyC/Q738/GPAATzwRDPq6Ab9vHyxcCCNHdvyBiUKdfPy1OeSdc7XArcCrwApgpnNu\nlZndZ2ZXRPsWjlHXiDRX18dXnjK6YeXRo1QM7bwXJmOusjL4d2ZmMFhvvhkeewzOOis4MobgaP3V\nV4Oj+DrV1bBmTXC0fdFFwWmXc+YEA71P5OyizZvhgw+aDvlDh+CVV5ruq6YGVq+Gug/wHjMmeB1g\n+XIYNQqysppmPnw4eLG4f394/nl49ll46y348pehd++YPjzSecJ08jjnXgZGNls3vZVtL4xBrk5z\nVoijxUTwMVe8MmWvW051Xn9qezQMkv0XXB0c0SYoU0d8tFce/P3vDUfDjX3kI7BhQ/D1qlXBIG48\nrNesCQb9mEYftzh/Pnz2sw3LK1ZA375wwgkN61avbrmvkhKorYUxYyjMyWlYv2wZRHrgJsrKgvu+\n5pqGXwxxVjhiRKfcT3sURntsPsT0jldJuOz1/6Jy6NimK5sPeOfoOe9vdCueR6+5z2FVFQBY5WH6\nvPhbuhXPo8eCV8h76SmoqabH/JcZ8PsHgyEH9HvmUbrsCF74TKs4SN7LT9Nt8RvkvfQUaYcOHHM9\ntTWc+Pi9DPzVPXD0KDmrF7e+LdB9Q0n9/baweDFcfHHwdXV18O+TT264fdmy4Eg6Ly9YPngQ9uyB\nxsOwcVXz7LPBv48cib6vIUMgJweeey5YV14OW7ZEH+LZ2WAW/ai9tDT6f494L+WHvI+dLviZKx6Z\nMss2kn7oABUFo4+5Xc6aJdiRSg5OOIeM8r1k7N8DQNdf3cOhcWdzcMI5dNm1jaM53clduZADZ15E\n1raNWG1N8P0lS6jJGwBHj3Lib77PBxPP5+DE86np2Ye0qorW1wM5JUvZPfUr7Lr6JroteZOKIWNb\n3RagZvlimDsXduxo+A9wDmbODIbxNdcE60aODF48rat2NmyAv/41qGrqZGVBly4Ny2VlsGQJDB4M\nO3cGL5hCUL906dJ0X//4BxQUQHU1pVsiZ0EvWxb08cOiXCUzPz/4pbBpU8O62tog98GDx3x+jpc6\n+fgLVdeIxFrmjs30fvUZssrWA0avN2eTs3Yp+8+bStXgln/C1+b2oPec5+i6cRXl532C6gH5ZG1a\nQ+7B/eyOdPmZO7ewb9xkqgYNIXPnFqr7nojLzCJjzw5qevbBZWaRs2IhaVWVZG7bSPb6f1F18nBq\n8ga0uh7g8OjTIyFqqR5w0jG3rXf//cGLrBUVwfCtqAgG8b33Qnp6sE1eHnzrW/Dkk8GZN9nZwdF9\n4yHfpUtw9skzzwQDuFcv+MY3ggG+d29wxg0ER9+33dawr9zc4CydGTPgySfZPmkSBQDvvw/nnNN6\nFXb33cE+Nm8OtnEOLrgABrR8I5p8OOh68vKhkbFvF7nLF9Drzdls+u7j9Cp6gS67t7Prmq+BcxRM\nv47Se34LGV3o/dqz1HbrwYGzp9Bt0etkbd/E3ks+Q8/5L5N+sJw9V97QZN+95j4fdX292tr64dz7\nlZmkVVW0uu1xX09+/frgLJdf/jIY1KlAp1CGouvJS1LrumEFJz5+LzW9+1F+3pVUFIwC4GjXHGq7\nBXVFzppIHZMRVBvpB/ZSHTm6zlm7jMqCUXRb+hZHBpyEy2j4AzazbCNddm3jyID8qOsheGG4+3uv\nY1UV5BbPgzRrddsOWbs2qF9SZcBLp0j5Ie9j9w1+5kpUpuq8ARwedTrdF71Or6IX2HfJZwD44LRz\n2V22gW6L36D7u3OoHNxwAtjBieeTu3IR3Ra/QdXAArK2rqO6z4kcHnsGOEf3Ra/TfeFc0g/up7rf\nQA6PPbPR+jn16zO3rufIgHyOnFhAwQ9uCiqhSz4bdR91jvt68qtXw+hjvzZxvHTtmvDUyYt0stpe\nfaNeYthlZbPw/KnBZRE2rKAycoQPUHnK6Kbn3Tey9+PXhV5/JH9okKF7bzbe/4c293FcNm6EP/4x\nOPOmd+/gDUk33hi7/UtKUycvSSH/odvZ8aW7qMlr5YJgnUif8doO6uRDUScvqau2lj6zniBr20Zy\nly9IdBoR76T8kPex+wY/c3mZaeNK9ky9kfUPPk/5+dE+5qDz6TNew1MnH38pP+RFRJKZOnmRGFMn\n3w7q5ENRJy8iIlGl/JD3sWcGP3MpUzjq5MNTJx9/KT/kRUSSmTp5kRhTJ98O6uRDUScvIiJRpfyQ\n97HTBT9zKVM46uTDUycffyk/5EVEkpk6eZEYUyffDurkQ1EnLyIiUaX8kPex0wU/cylTOOrkw1Mn\nH38pP+RFRJKZOnmRGFMn3w7q5ENRJy8iIlGl/JD3sdMFP3MpUzjq5MNTJx9/KT/kRUSSmTp5kRhT\nJ98O6uRDiXsnb2ZTzGy1mZWY2V1Rbv93M1thZsVm9pqZnXQ8YUREJLbaHPJmlgY8ClwKjAWmmdmo\nZpstBk53zk0AngMejHXQePGx0wU/cylTOOrkw1MnH39hjuTPBNY65zY556qBmUCTT0x2zr3hnKuM\nLL4NDIptTBEROR5hhvwgYEuj5a0ce4jfCPy9I6E601nDxiU6QlQ+5lKmcCYV+NfHF47z73ECKBwx\nItERWigsLEx0hJjKCLFNtLI/6qu1ZvYF4HTg/I6EEhGR2Agz5LcCJzdazge2Nd/IzC4G/hM4L1Lr\nRHXn0w+Tn9cfgO7ZuYwZNKT+aKyuX+3M5ZVlG7jh/KkJu//Wlht3zT7kAfjdG7MS/nw1X/bx+Tt4\nqIzTTx9W34PXHUUncrlxJ+9Dnrrl4sWLuS1ydk1dF153JJ2o5bp1icxTVFTEjBkzACgoKKAj2jyF\n0szSgTXARcB24F1gmnNuVaNtTgP+DFzqnFt/jH15dwrlO+uWe/knv4+5lCmcOUtf5uZPTUl0jCaK\nli/3srIpmjuXwoceSnSMJoqKiryrbDpyCmWo8+TNbArwM4IO/wnn3I/N7D5goXNutpm9BpxK8EvA\ngE3Ouaui7Me7IS8SazpPvh10nnwoHRnyYeoanHMvAyObrZve6OtLjufORUQkvlL+sgY+nmcNfuZS\npnB0nnx4Ok8+/lJ+yIuIJDNdu0YkxtTJt4M6+VB0PXkREYkq5Ye8j50u+JlLmcJRJx+eOvn4S/kh\nLyKSzNTJi8SYOvl2UCcfijp5ERGJKuWHvI+dLviZS5nCUScfnjr5+Ev5IS8ikszUyYvEmDr5dlAn\nH4o6eRERiSrlh7yPnS74mUuZwlEnH546+fhL+SEvIpLM1MmLxJg6+XZQJx+KOnkREYkq5Ye8j50u\n+JlLmcJRJx+eOvn4S/khLyKSzNTJi8SYOvl2UCcfijp5ERGJKuWHvI+dLviZS5nCUScfnjr5+Ev5\nIS8ikszUyYvEmDr5dlAnH4o6eRERiSrlh7yPnS74mUuZwlEnH546+fhL+SEvIpLM1MmLxJg6+XZQ\nJx+KOnkREYkq1JA3sylmttrMSszsrii3Z5rZTDNba2YLzOzk2EeNDx87XfAzlzKFo04+PHXy8dfm\nkDezNOBR4FJgLDDNzEY12+xGYK9zbjjwMPBfsQ4aLyvLNiQ6QlQ+5lKmcNbsKEt0hBaKN/j3OAEU\nb9mS6AgtFBcXJzpCTIU5kj8TWOuc2+ScqwZmAlObbTMVeDLy9V+Ai2IXMb4+qDiU6AhR+ZhLmcI5\nWFmR6Agt7D/k3+MEsL/Cw8dq//5ER4ipMEN+END41+3WyLqo2zjnaoH9ZpYXk4QiInLcwgz5aK/o\nNj8lp/k2FmUbL23d+36iI0TlYy5lCmfb/r2JjtBC6fv+PU4ApXv2JDpCC6WlpYmOEFNtnkJpZpOB\ne51zUyIsYD5FAAAFJElEQVTLdwPOOfdAo23+HtnmHTNLB7Y75/pH2deHYvCLiPjmeE+hzAixzUJg\nmJkNBrYD1wLTmm3zV+BLwDvAp4G5sQwpIiLHp80h75yrNbNbgVcJ6p0nnHOrzOw+YKFzbjbwBPCU\nma0F9hD8IhARkQTr1He8iohI54rLO159fPNUiEz/bmYrzKzYzF4zs5MSnanRdteY2VEzm+hDJjP7\nTOSxWm5mf4h3pjC5zOwkM5trZosjz+Flcc7zhJntNLNlx9jm55Gf8WIzmxDPPGFzmdnnzGxpJNM8\nMxuX6EyNtjvDzGrM7JM+ZDKzQjNbYmb/MrPXE53JzHqY2YuR5265mV0fasfOuZj+Q/CLYx0wGOgC\nFAOjmm3zNeCXka8/C8yMdY7jyHQ+0DXy9S0+ZIps1w14A5gPTEx0JmAY8B7QI7LcN56Z2pHr18DN\nka9HAxvjnOkcYAKwrJXbLwP+Fvn6LODteD9OIXNNBnpGvp7SGbnaytToOZ4DzAY+mehMQE9gBTAo\nstwZP+dtZfpP4Ed1eQiq8Yy29huPI3kf3zzVZibn3BvOucrI4tu0fC9Ap2eKuB94AKiKc56wmW4C\nfuGcOwDgnNvtSa6jQI/I172AuL7t1Dk3D9h3jE2mAr+PbPsO0NPMBsQzU5hczrm3nXPlkcXO+DkP\n81gBfJNgFnTKuZ4hMn0OeM45VxbZPu4/5yEyOaB75OvuwB7nXE1b+43HkPfxzVNhMjV2I/D3OOaB\nEJkif+LnO+deinOW0JmAEcDIyJ/6883sUk9y3Qd80cy2EBwNfrMTch1L88xldMJAbaevEP+f8zaZ\n2UDgKuBXRH9fTiKMAPLM7HUzW2hmX0x0IILLy4wxs23AUuBbYb4pzCmU7eXjm6fCZAo2NPsCcDpB\nfRNPx8xkZgY8RHBq6rG+p9MyRWQQVDbnAScDb5rZ2Loj+wTmmgb8zjn3UOS9HX8guNZSooT+mUsE\nM7sAuIGgIki0h4G7nHMu+LH3YtBnABOBC4FcYIGZLXDOJfLqc5cCS5xzF5rZUOA1MxvvnDt4rG+K\nx5H8VoL/+evkA9uabbMFOAkg8uapHs65tv6ci3cmzOxigt7rE5FaIJ7aytSdYEgVmdlGgi51Vpxf\nfA3zOG0FZjnnjjrnSoE1wPA4Zgqb60bgWQgqCaCrmfWNc65j2UrkZzwi6s9cIpjZeOBx4Mo4/38X\n1iRgZuTn/BrgF2Z2ZYIzbQVeds5VOuf2AP8EPpLgTDcAzwM459YDG4HmF4tsIR5Dvv7NU2aWSXDO\nfPNPCql78xQc481TnZnJzE4j+HPxysiTGm/HzOScO+Cc6++cG+KcO4WgP/2Ec25xojJFvEBwdENk\niA4H4n2JwzC5NgEXR3KNBrI6oUc1Wj/qfBG4LpJnMrDfObczznnazBU5k+054IuRQdFZWs0U+Rmv\n+zn/C/B151xnfLrQsZ6/WcC5ZpZuZjkEL56vSnCmxj/jAwgqpbb/34vTq8RTCI7w1gJ3R9bdB1wR\n+TqL4KhrLcHwKuiEV67byvQawTt6FwNLgBcSnanZtnOJ89k1YTMBPyE482Ap8Ol4Zwr5/I0G5hGc\nebMYuCjOeZ4mODKvAjYTHGXdDHy10TaPEpwVtLQznrswuYDfEJyVUfdz/m6iMzXb9rd0ztk1YZ6/\nOyI/58uAbyY6E3Ai8EokzzJgWpj96s1QIiJJTB//JyKSxDTkRUSSmIa8iEgS05AXEUliGvIiIklM\nQ15EJIlpyIuIJDENeRGRJPa/BwEbCrfj2D8AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_transformation(Square, F_squeeze.dot(Square), \"$Square$\", \"$F_{squeeze} Square$\",\n", " axis=[0, 1.8, 0, 1.2])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's show a last one: reflection through the horizontal axis:" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAD7CAYAAAClvBX1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlwW9d96PHvATeQBECACyRRlEQtlmwttizZVhzHKWPH\njeNMnDpNJs6La8mZbtPkJemS19RJJp3XmWaZtHWal3baponGaZbGbpqlk6R2rMBpZMu7bGqxJEuU\nuIgSN3ABSezn/XEIkZJIiQsu7gXu7zODkS4IXpyfLvXjwe+eRWmtEUIIUVw8djdACCHEwknyFkKI\nIiTJWwghipAkbyGEKEKSvIUQoghJ8hZCiCJUXqg3UkrJmEQhhFgErbW69LmC9ry11q56fO5zn7O9\nDRKzxCzxFnfMc5GyiYVOnz5tdxMKTmIufW6LF5wZsyRvIYQoQpK8LbRnzx67m1BwEnPpc1u84MyY\n1ZVqKnl9I6V0od5LCCFKhVIKbfcNS7eJRCJ2N6HgJObS57Z4wZkxS/IWQogilLeyiVLKA7wIdGut\n753l61I2EUKIBSpE2eTjwJE8nk8IIcQc8pK8lVItwD3A1/NxvlLhxDqZ1STm0ue2eMGZMeer5/13\nwCcBqYsIIUQBLHltE6XUu4DzWuuDSqk24LLaTM6ePXtobW0FIBgMsn37dtra2oDp32yldpzjlPbI\ncf6P29raHNUeiTf/x7nnCvF+kUiEvXv3AlzIl7NZ8g1LpdRfAw8AaaAa8AM/0Fo/eMnr5IalEEIs\nkGU3LLXWD2utV2ut1wH3A/suTdxulftt6iYSc+lzW7zgzJhlnLcQQhQhmR4vhBAOJtPjhRCihEjy\ntpAT62RWk5hLn9viBWfGLMlbCCGKkNS8hRDCwaTmLYQQJUSSt4WcWCezmsRc+twWLzgzZkneQghR\nhKTmLcQCaa0ZHR2lq6ufeDzJTTdttrtJooTNVfNe8sJUQrhFKpWiv3+AU6cGGBurIJEoZ+PGKrub\nJVxKyiYWcmKdzGqlGPPo6ChHj55i377DvPpqEqXWEw5fS1VVlubmhpKM+UrcFi84M2bpeQsxi3Q6\nzcDAIKdO9TMy4qGioolQaA1lZWUAJJMJvN5J6urqbG6pcCupeQsxQywW4+zZAU6fHiaTCeLzNVJT\n47vsdQMDvWzalKa1dZUNrRRuIjVvIeaQyWQYGhqio6OfwcEs5eVN1NW1UF4+93+PbHaQcHhdAVsp\nxMWk5m0hJ9bJrFZMMU9MTHDy5Bl++ct2XnxxjHh8FeHwVurrl10xcU9MxAiFFDU1NUBxxZwPbosX\nnBmz9LyFq2SzWaLRKKdP99PXl8LjaSQY3EJ5ecW8zzE+PsgNNzRY2Eohrk5q3sIV4vE4587109Ex\nRDxeS01NE7W1AZSac8vVWWWzWYaGXuOOO7ZQUTH/hC/EYknNW7iO1prh4WE6O/vp7Y2jVAN1ddcR\nCFQu+pxjY8M0N9dK4ha2k5q3hZxYJ7OaE2JOJpN0dfXwq1+1c+BAP0NDTTQ2bqOxcSUVFYtP3ACJ\nxCArV15cMnFCzIXktnjBmTFLz1uUhJlT1nt6xtG6nkBgI+GwN2/vkUolqaoaJxhcn7dzCrFYUvMW\nRe3SKeuVlU0EAiE8nvx/qBwcPMf69QnWr1+T93MLMRepeYuSMjo6Sk/PAJ2do2SzIQKB9YTDNZa+\nZyYzyLJlkriFM0jN20JOrJNZzcqY0+k0586d55lnDrF/fzc9PX5CoW2Ew2vweq1N3JOT49TVaXy+\ny2dbuu06uy1ecGbM0vMWjheLxejtHaCjIzdlvZVw+PIkam0bBrn+ehnbLZxDat7CkWabsh4INFxx\n5qNVtNYMDr7G2952HZWVSxutIsRCSc1bFIWJiQl6e/vp6IiSSgWorV1FOOy3tU1jY8MsX14tiVs4\nitS8LeTEOpnVFhNzNptlcHCQl156naefPskbb1Ti928hHF5Hba29iRsgHh+kpWXukonbrrPb4gVn\nxiw9b2Gby6esr6CpaeFT1q2UTqeoqIgRCskKgsJZpOYtCmr2KetNS575aJWhofO0tk5yzTWtdjdF\nuJTUvIWtkskk58/3c+rUIBMTXrzeJhobg47qZc8mnR5k+XLZcEE4j9S8LeTEOpnVZsastWZkZIRD\nh97gl788yuHDWSoqNhIObyQQCDk+ccfjE/j9Gfz+K9fd3Xad3RYvODNm6XmLvJttynp9/TpLpqxb\naWxskK1bZWy3cCapeYu8uXzKepPlMx+torWmv/817rjjWqqqquxujnAxqXkLS1xtl/ViFYuNsGyZ\nVxK3cKzi+hxbZJxYJ8uXWCzGiROn2bfvEK+8Mkkm00o4vJmTJw8XfeIGmJwcZPXq+ZVMSvk6z8Zt\n8YIzY5aet5i3xeyyXozS6TTl5WOEQq12N0WIOUnNW1zV5VPWmxwx89Eq0Wg/q1bF2LRprd1NEUJq\n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\nkryFEKII/X/W+4jkVUmwMgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_reflect = np.array([\n", " [1, 0],\n", " [0, -1]\n", " ])\n", "plot_transformation(P, F_reflect.dot(P), \"$P$\", \"$F_{reflect} P$\",\n", " axis=[-2, 9, -4.5, 4.5])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix inverse\n", "Now that we understand that a matrix can represent any linear transformation, a natural question is: can we find a transformation matrix that reverses the effect of a given transformation matrix $F$? The answer is yes… sometimes! When it exists, such a matrix is called the **inverse** of $F$, and it is noted $F^{-1}$.\n", "\n", "For example, the rotation, the shear mapping and the squeeze mapping above all have inverse transformations. Let's demonstrate this on the shear mapping:" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nYRaCAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_inv_shear = np.array([\n", " [1, -1.5],\n", " [0, 1]\n", "])\n", "P_sheared = F_shear.dot(P)\n", "P_unsheared = F_inv_shear.dot(P_sheared)\n", "plot_transformation(P_sheared, P_unsheared, \"$P_{sheared}$\", \"$P_{unsheared}$\",\n", " axis=[0, 10, 0, 7])\n", "plt.plot(P[0], P[1], \"b--\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We applied a shear mapping on $P$, just like we did before, but then we applied a second transformation to the result, and *lo and behold* this had the effect of coming back to the original $P$ (we plotted the original $P$'s outline to double check). The second transformation is the inverse of the first one.\n", "\n", "We defined the inverse matrix $F_{shear}^{-1}$ manually this time, but NumPy provides an `inv` function to compute a matrix's inverse, so we could have written instead:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , -1.5],\n", " [ 0. , 1. ]])" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F_inv_shear = LA.inv(F_shear)\n", "F_inv_shear" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Only square matrices can be inversed. This makes sense when you think about it: if you have a transformation that reduces the number of dimensions, then some information is lost and there is no way that you can get it back. For example say you use a $2 \\times 3$ matrix to project a 3D object onto a plane. The result may look like this:" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n/wOE7vvJmGtThwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot([0, 0, 1, 1, 0, 0.1, 0.1, 0, 0.1, 1.1, 1.0, 1.1, 1.1, 1.0, 1.1, 0.1],\n", " [0, 1, 1, 0, 0, 0.1, 1.1, 1.0, 1.1, 1.1, 1.0, 1.1, 0.1, 0, 0.1, 0.1],\n", " \"r-\")\n", "plt.axis([-0.5, 2.1, -0.5, 1.5])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at this image, it is impossible to tell whether this is the projection of a cube or the projection of a narrow rectangular object. Some information has been lost in the projection.\n", "\n", "Even square transformation matrices can lose information. For example, consider this transformation matrix:" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_project = np.array([\n", " [1, 0],\n", " [0, 0]\n", " ])\n", "plot_transformation(P, F_project.dot(P), \"$P$\", \"$F_{project} \\cdot P$\",\n", " axis=[0, 6, -1, 4])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This transformation matrix performs a projection onto the horizontal axis. Our polygon gets entirely flattened out so some information is entirely lost and it is impossible to go back to the original polygon using a linear transformation. In other words, $F_{project}$ has no inverse. Such a square matrix that cannot be inversed is called a **singular matrix** (aka degenerate matrix). If we ask NumPy to calculate its inverse, it raises an exception:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LinAlgError: Singular matrix\n" ] } ], "source": [ "try:\n", " LA.inv(F_project)\n", "except LA.LinAlgError as e:\n", " print(\"LinAlgError:\", e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is another example of a singular matrix. This one performs a projection onto the axis at a 30° angle above the horizontal axis:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nA9TMRUQc8P8BDQN3GjTsujoAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "angle30 = 30 * np.pi / 180\n", "F_project_30 = np.array([\n", " [np.cos(angle30)**2, np.sin(2*angle30)/2],\n", " [np.sin(2*angle30)/2, np.sin(angle30)**2]\n", " ])\n", "plot_transformation(P, F_project_30.dot(P), \"$P$\", \"$F_{project\\_30} \\cdot P$\",\n", " axis=[0, 6, -1, 4])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But this time, due to floating point rounding errors, NumPy manages to calculate an inverse (notice how large the elements are, though):" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1.20095990e+16, -2.08012357e+16],\n", " [ -2.08012357e+16, 3.60287970e+16]])" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.inv(F_project_30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you might expect, the dot product of a matrix by its inverse results in the identity matrix:\n", "\n", "$M \\cdot M^{-1} = M^{-1} \\cdot M = I$\n", "\n", "This makes sense since doing a linear transformation followed by the inverse transformation results in no change at all." ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0.],\n", " [ 0., 1.]])" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F_shear.dot(LA.inv(F_shear))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another way to express this is that the inverse of the inverse of a matrix $M$ is $M$ itself:\n", "\n", "$((M)^{-1})^{-1} = M$" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , 1.5],\n", " [ 0. , 1. ]])" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.inv(LA.inv(F_shear))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also, the inverse of scaling by a factor of $\\lambda$ is of course scaling by a factor or $\\frac{1}{\\lambda}$:\n", "\n", "$ (\\lambda \\times M)^{-1} = \\frac{1}{\\lambda} \\times M^{-1}$\n", "\n", "Once you understand the geometric interpretation of matrices as linear transformations, most of these properties seem fairly intuitive.\n", "\n", "A matrix that is its own inverse is called an **involution**. The simplest examples are reflection matrices, or a rotation by 180°, but there are also more complex involutions, for example imagine a transformation that squeezes horizontally, then reflects over the vertical axis and finally rotates by 90° clockwise. Pick up a napkin and try doing that twice: you will end up in the original position. Here is the corresponding involutory matrix:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n09zczMaNGwHO58upODJUUCn1EvBpqXknYaaFozJVZ6cZzigLXQmRsHSs5+2hQmwGmWrhqIoKt1vl\njKoqs9DVSy+ZMoosdCWEY5IdKvghpdRx4CbgGaXUs840y9smf6RNWHs7/OIX8MtfmiS+aNHMK/6l\niCM17+nkjS4329NjauEtLeZTRoo4dm48wqZ4bIoF3I8n2dEmTwFPOdSWS0dPD7zxBhw4YBaMWrzY\n7RalXkWFmQX68MPw8suwe7cZG/57v2eGGSplpvkfOmRG13zzm/DJT7rdam/autW8Pr/6lflkc9dd\n5jWMRs2nuOJi+OIX4YYb3G6pSCGZHp9OkxeOqqz01rC/dOnpgU9/Gq66yqx+OHlm6Mc+Bu9+N3z4\nw+60L1MsXw7XXw8/+9mFj3/2s/Dtb5tZsMuWudM24RiZHu+moSHTm3z4Ydi718xOrKq6NBM3mB5i\nd7eZ0v/446Z8NNGaNZJ0ZnP0KBw+bK4jTHbbbeai99NPp79dIm0keSdgzrWukREzueahh0yZpLIS\namo8d2ODlNa8p7J9u3nj2rDBzNB84gn40pdMCQBMUl+5MqFDu12HdNq08bz4onkNp0ree/eOry7p\nIZfMuUkTWc87FeJxM41961ZzQ9+qqvSvP+JlO3eai7OVlWY7FoPvf9/U/m+7Dd7zHnfblwk2bYKy\nMnOXo8keeMB8cpGyk9Wk5u0kreH0aZO029tNcvL53G6V99x7r5k+v3KluQ7Q0mJq3H/0R6accvXV\n8M53musCYmp1deaC5M9/Pv5YKASf+pR5c/z5z80bpMh46RjnfWmbvHDUpTCCJBEnT5rx7B/9qFkD\nBUyiqa01oyR8Pti3D374Q/PYV7/q/LWBxx4zF0yfegre8Y7Z929uNhdXxz4pAHzve2Zd83/6J2fb\nNhf795vVJXt74XOfM52G/n7zCeauu+DHP05/m0TaSc07ARfUukIhMwnlpz81MwoXLfLOin9zlNaa\n91i9+4orxh+Lx01yhPGFrtatM9cHXnjB9M7naE51yN//fdOGhoa5HfQznzHXLya6+27Ty3XSiy+a\nHvWEGKaMZ6zeff/98OUvw1e+YkaXfO978IEPONsmB7ldI3aa2/FIzztRg4MmEb399vi62jL9e3Y7\nd5qp/2Vl44/dddfFr11trelRHj1qvtavhxUrnOmFb9sGq1fP7cJxX59ZMbGm5sLHq6uTb8dkkYjp\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_involution = np.array([\n", " [0, -2],\n", " [-1/2, 0]\n", " ])\n", "plot_transformation(P, F_involution.dot(P), \"$P$\", \"$F_{involution} \\cdot P$\",\n", " axis=[-8, 5, -4, 4])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, a square matrix $H$ whose inverse is its own transpose is an **orthogonal matrix**:\n", "\n", "$H^{-1} = H^T$\n", "\n", "Therefore:\n", "\n", "$H \\cdot H^T = H^T \\cdot H = I$\n", "\n", "It corresponds to a transformation that preserves distances, such as rotations and reflections, and combinations of these, but not rescaling, shearing or squeezing. Let's check that $F_{reflect}$ is indeed orthogonal:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 0],\n", " [0, 1]])" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F_reflect.dot(F_reflect.T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Determinant\n", "The determinant of a square matrix $M$, noted $\\det(M)$ or $\\det M$ or $|M|$ is a value that can be calculated from its elements $(M_{i,j})$ using various equivalent methods. One of the simplest methods is this recursive approach:\n", "\n", "$|M| = M_{1,1}\\times|M^{(1,1)}| - M_{1,2}\\times|M^{(1,2)}| + M_{1,3}\\times|M^{(1,3)}| - M_{1,4}\\times|M^{(1,4)}| + \\cdots ± M_{1,n}\\times|M^{(1,n)}|$\n", "\n", "* Where $M^{(i,j)}$ is the matrix $M$ without row $i$ and column $j$.\n", "\n", "For example, let's calculate the determinant of the following $3 \\times 3$ matrix:\n", "\n", "$M = \\begin{bmatrix}\n", " 1 & 2 & 3 \\\\\n", " 4 & 5 & 6 \\\\\n", " 7 & 8 & 0\n", "\\end{bmatrix}$\n", "\n", "Using the method above, we get:\n", "\n", "$|M| = 1 \\times \\left | \\begin{bmatrix} 5 & 6 \\\\ 8 & 0 \\end{bmatrix} \\right |\n", " - 2 \\times \\left | \\begin{bmatrix} 4 & 6 \\\\ 7 & 0 \\end{bmatrix} \\right |\n", " + 3 \\times \\left | \\begin{bmatrix} 4 & 5 \\\\ 7 & 8 \\end{bmatrix} \\right |$\n", "\n", "Now we need to compute the determinant of each of these $2 \\times 2$ matrices (these determinants are called **minors**):\n", "\n", "$\\left | \\begin{bmatrix} 5 & 6 \\\\ 8 & 0 \\end{bmatrix} \\right | = 5 \\times 0 - 6 \\times 8 = -48$\n", "\n", "$\\left | \\begin{bmatrix} 4 & 6 \\\\ 7 & 0 \\end{bmatrix} \\right | = 4 \\times 0 - 6 \\times 7 = -42$\n", "\n", "$\\left | \\begin{bmatrix} 4 & 5 \\\\ 7 & 8 \\end{bmatrix} \\right | = 4 \\times 8 - 5 \\times 7 = -3$\n", "\n", "Now we can calculate the final result:\n", "\n", "$|M| = 1 \\times (-48) - 2 \\times (-42) + 3 \\times (-3) = 27$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get the determinant of a matrix, you can call NumPy's `det` function in the `numpy.linalg` module:" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "27.0" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M = np.array([\n", " [1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 0]\n", " ])\n", "LA.det(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the main uses of the determinant is to *determine* whether a square matrix can be inversed or not: if the determinant is equal to 0, then the matrix *cannot* be inversed (it is a singular matrix), and if the determinant is not 0, then it *can* be inversed.\n", "\n", "For example, let's compute the determinant for the $F_{project}$, $F_{project\\_30}$ and $F_{shear}$ matrices that we defined earlier:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.det(F_project)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's right, $F_{project}$ is singular, as we saw earlier." ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.0816681711721642e-17" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.det(F_project_30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This determinant is suspiciously close to 0: it really should be 0, but it's not due to tiny floating point errors. The matrix is actually singular." ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.det(F_shear)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Perfect! This matrix *can* be inversed as we saw earlier. Wow, math really works!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The determinant can also be used to measure how much a linear transformation affects surface areas: for example, the projection matrices $F_{project}$ and $F_{project\\_30}$ completely flatten the polygon $P$, until its area is zero. This is why the determinant of these matrices is 0. The shear mapping modified the shape of the polygon, but it did not affect its surface area, which is why the determinant is 1. You can try computing the determinant of a rotation matrix, and you should also find 1. What about a scaling matrix? Let's see:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEACAYAAABBDJb9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlwXGeZLvDnleRWa2/tluVFtuM1juNtyALXkRMGwoQh\noQYSAgyYqmGg5lLJsGSGya26uRRVDPMHEMhlFm64MWEyJEOGEAIhmEqunIUsdrwg23GcxYvkTeqW\nWlJLaknd/d0/PsmSZS1H6nP6nPOd51flilpqn/5eS3n71dNfnyNKKRARkb/lub0AIiLKHps5EZEB\n2MyJiAzAZk5EZAA2cyIiA7CZExEZwLZmLiJ5IrJfRH5l1zGJiMgaOyfzuwEctfF4RERkkS3NXEQW\nA/gzAA/acTwiIpobuybz7wG4BwDfTkpE5IKsm7mI3ALgglLqIAAZ/UNERDkk2Z6bRUS+BeDTAFIA\nigCUAfiFUuozk+7HqZ2IaB6UUrMOyVlP5kqpe5VSS5VSKwB8AsBzkxv5hPsa++e+++5zfQ2sj7Wx\nPvP+WMV95jY5efKk20twlMn1mVwbwPqCosDOgyml9gDYY+cxiYhodpzMbbJz5063l+Aok+szuTaA\n9QVF1i+AWn4gEZWrxyIiMoWIQOXiBVDSWlpa3F6Co0yuz+TaANYXFGzmREQGYMxCRORhjFmIiAKE\nzdwmpud2Jtdncm0A6wsKNnMiIgMwMyci8jBm5kREAcJmbhPTczuT6zO5NoD1BQWbORGRAZiZExF5\nGDNzIqIAYTO3iem5ncn1mVwbwPqCgs2ciMgAzMyJiDyMmTlRwGUyGXR1dWFoaMjtpVAOsJnbxPTc\nzuT6TKstmUzi5Mk27NnTiuefP4lf//o3bi/JUaZ9/+bL1muAEpE7MpkM4vE4Tp3qxPnzQ8jLq0Zp\n6WoUFb2J/Pxyt5dHOcDMnMjHkskkzp/vxIkTXUgmi1FUVIvS0gqICOLxGOrru7FhwxVuL5OyYDUz\n52RO5DNTTeHl5WtRXl54yf2Gh2NobKx1aZWUa8zMbWJ6bmdyfX6pbWIW/uqrMfT01KO29irU1DQi\nFJrcyIcQDg8iEon4pr75Mr0+qziZE3mY1Sl8sr6+GFavroLIrL+dkyGYmRN50ExZuBUdHa244YaV\nKC4udnil5DRm5kQ+M98pfLL+/j5UV+ezkQcMM3ObmJ7bmVyf27XNJQu3or8/iqammou33a7PaabX\nZxUncyIX2DWFT5ZOp5Gf34OqqiU2rZT8gpk5UQ5lm4XPJh6PoqGhB+vXr7TleOQ+ZuZEHuHUFD6V\n4eEoGhsbbD8ueR8zc5uYntuZXJ9Ttdmdhc9maCiJkpJhlJdf+vZ9k793gPn1WcXJnMhGmUwG3d3d\nOH066vgUPllfXwzr1nFveVAxMyeygdNZ+GyUUujsbMWOHasRDodz8piUG8zMiRzm5hQ+WX9/L+rq\nQmzkAcbM3Cam53Ym1zfX2iZm4a+91uV4Fm7FwEAMS5dWT/k1k793gPn1WcXJnMgCL03hk6VSKRQU\n9KKqapnbSyEXZZ2Zi0ghgOcBhKCfHB5XSn1jivsxMyffcTsLt6KrqwNLl/ZjzZrlbi+FHJCzzFwp\nNSQiO5RSAyKSD+AlEfmtUuq1bI9N5AYvT+FTSaViaGhodHsZ5DJbMnOl1MDoh4XQTxCBG8FNz+1M\nrm+sNi9m4bNJJgdRVpZCWVnZtPcx+XsHmF+fVbZk5iKSB+B1ACsB/FAptdeO4xI5LZPJoKenBwcO\nvOmLKXyyvr4oNmyo9lTsQ+6wpZkrpTIANotIOYBfish6pdTRyffbuXMnmpqaAACRSASbNm1Cc3Mz\ngPFnV7/eHvucV9bD+ma+vXv3bnR1xVFfvwah0Hrs2fMmiopKsG3bRgDAvn36/tu2NXv4tsKyZVWo\nrV07Y73Nzc2u/3s7edu0+lpaWrBr1y4AuNgvrbD9TUMi8j8BJJRS3530eb4ASq6aOguv8WyEMpu+\nvjgqKi5g8+Y1bi+FHGT1BdCsM3MRqRGRitGPiwC8H8CxbI/rN2PPrKbyc32zZeFjU6/fDA5GsXRp\nzaz38/P3zgrT67PKjpilAcBPRnPzPACPKaWetuG4RPPmtx0pc5VKjSAUSqCycoXbSyGP4LlZyCh+\n2Bduh66uC2hqGsSqVU1uL4UcxnOzUGCYPoVPJZWKoqGB7/ikcTw3i01Mz+28WJ9d+8L9lpkPDvaj\nokKhtLTU0v29+L2zk+n1WcXJnHwliFP4ZIlEDBs3Tn1SLQouZubkC0HJwmeTyWTQ1dWKHTvWIRQK\nub0cygFm5uR7nMIv19cXx6JFxWzkdBlm5jYxPbfLZX25PkeKnzLzoaEYGhvnFrHwZzMYOJmTJ3AK\nn93IyDDC4QFEIivdXgp5EDNzchWzcOui0XNYtWoEK1YsdXsplEPMzMmzOIXPTyYTQ309L0BBU2Nm\nbhPTczs76vPq+cL9kJkPDCRQVZWHkpKSOf9d/mwGAydzchSncHskElFs3sy95TQ9ZubkCGbh9tFP\niH/Ejh1XYsGCBW4vh3KMmTnlHKdwZ/T2dmPx4jI2cpoRM3ObmJ7bzVSfV7Nwq7yemQ8PR7Fo0fwj\nliD/bAYJJ3Oal8lTeH5+DcrKOIXbbXh4CEVFSVRUVLi9FPI4ZuY0J8zCcysWO4s1azJYtmyx20sh\nlzAzJ9twCneHUgrpdAx1dVe4vRTyAWbmNjExt5uYhT/44G8vZuHV1Yt8kYVb5dXMvL+/D7W1BSgq\nKsrqOCb+bE5ken1WcTKnS0w3hUci3Sgri7i9vEAZGIhh/frZL9hMBDAzp1HMwr0lnU4jHm/FjTdu\nQEEBZ64gY2ZOs2IW7l29vV1YsqScjZwsY2ZuEz/ldtPtC58pC/dqrmwHL9Y2MhJDY6M9EYuffjbn\nw/T6rOLTfkBwCvePZHIQJSXDKCsrc3sp5CPMzA3HLNx/otF2rF8vWLKk0e2lkAcwMw8wTuH+pZSC\nUl2orV3t9lLIZ5iZ28QLud18snCrvJgr28VLtSUSPairK0Q4HLbtmF742XSS6fVZxcnc5ziFm2Vw\nMIYNG3jecpo7ZuY+xSzcPKlUCn19h7Fjx1XIz893eznkEczMDcQp3Gw9PTEsXx5hI6d5YWZuEydz\nOyezcKu8lCvbzSu1pdMxLFxof8RieqZsen1WcTL3KE7hwZJMDqC8PM295TRvzMw9hll4MHV0nMbV\nVy/AokUNbi+FPIaZuY9wCg82pRREulFTs87tpZCPMTO3yXxyOy9k4VZ5JVd2gtu19fXF0dBQhFAo\n5MjxTc+UTa/PKk7mOcYpnCZLJmNYsoTnLafsZJ2Zi8hiAA8DWAggDeD/KKV+MMX9Ap2ZMwunqaRS\nI0gkjmDHjo3Iy+MvynS5XGbmKQBfUUodFJFSAK+LyG6l1DEbju1rnMJpNj09MaxcWclGTlnL+idI\nKXVeKXVw9OMEgDcABO50bxNzOz9l4Va5nSs7yc3a9N5yZyMW0zNl0+uzytbMXESaAGwC8Kqdx/WD\nTCaDWCzGKZwsGxhIIBIBSkpK3F4KGcC2feajEUsLgG8qpZ6c4uvGZubxeA/27z+BgYEwSksXMgsn\nSzo7T+HqqwvR0LDQ7aWQh+V0n7mIFAB4HMBPp2rkY3bu3ImmpiYAQCQSwaZNm9Dc3Axg/FclP94u\nLAyhre0ootEBrF+/Hel0Cm++eQj5+fnYtk3ff+xXed7mbQDYu/c59Pa+i5tu+iwAb/0887a7t1ta\nWrBr1y4AuNgvrbBlMheRhwFElVJfmeE+xk7mgP5mbN++HT09PTh/vhtnzvRiZKQYoVAVSksjvr8w\n7759LRcbkWncqC0ej6G+vhsbNlzh+GO1tLRcbBomMr2+nE3mIvJeAJ8C0CoiBwAoAPcqpZ7J9th+\nk5eXh8rKSlRWVmLNmsyExt5uVGOn7A0Px9DYWOv2MsggPDdLDmQyGWMndpq74eEhJJPH0Ny8ka+t\n0KysTuZs5jnGxk6x2FmsXp1GU9MSt5dCPmC1mfOdCjaxutd1LIpZt24FbrxxI669thaLFvWir+8w\nOjqOIx6PIpVKObvYeeA+c/uk0zHU1eXu0nCm78M2vT6rOAq6iBl78PT396G6Oh/FxcVuL4UMw5jF\ngxjFmKuj4wS2bi1BXV2d20shn2Bmbgg2dnOk02nE46248cYN/N6RZWzmOZaLva5uNnbuM7/UoUPA\nz34GvPwyMDICNDcDBQVAKgVcuAAUFwNf/CJw5ZXjfycej6KhoQfr16+0df2zMX0ftun18UpDBnIj\nY5ehJPKGBm07nimuvlr/ufVWYO1a4FvfuvTrDzwAfOELwKOPAosX688ND0fR2MjLwpEzOJkbwPaJ\nXSkUdHcifPIYwu8cRqqyFvH3f9z+hfvcuXPARz4CfO1rwB13XPq1l18G7roL+PKXgU9+EhgaSmJk\n5Di2b7+Ke8tpTjiZB4hdE7sMJRE6dwrFxw8gv6cLKhQGFJBs4rUpp/Laa4AIsHXr5V87cUJ/rbJS\n3+7ri2Hduio2cnIM95nbxCt7Xee8j10pFHR1oHT/86j+zU9Qtu85QAEj9UuQqqgG8gTDi5q4z3zK\nvweUlQFXTHF6ld/8BmhsBG68UV+wOZOJoa7OnUvDeeVn0ymm12cVJ3ODzTSxp/vzUdbdj9r2dxFK\nxKFCYYxU1gP5+Rf/fn5/D4YXLkOmuNTFKrzr9deBzZsv/VwiAXznO0BeHvAv/wIUFgKJRC/q6kII\nh8PuLJQCgZl5kCgFdHYic/QoBg8cQG88gc7UAowsiKCgoAzhcAnyJzTzBRfa0Pu+WzDcsMzFRXvT\nqVPAxz6mI5arrtL/tAMDQCYDXHcdcMMN4/ft6HgX27aVobaWJ9aiuWNmTuOSSd19DhwAurqQFw6j\nZPlylOTnoz6TwcDAALq7E4jFokinC3VjLwihYEEIw7WL3F69J+3dqzPxL30J2LBh+vulUikUFPSi\nqopPiOQsZuY28VxupxTQ0QE8/zzwk58Azz2nP79kCVBbezFOycvLQ2lpKZYsWYiNG5uwZk0FqqoG\nkO5oxdnKMsQTPUilUszMJ9m7FygpAdavn/l+vb1dWLq04pLfeHLNcz+bNjO9Pqs4mZtm0hSOcBio\nvzQLn85YYy8tLUVGDaP3g1txbqQXZ860Ix5vQzwe5TtPR+3fD2zbprPxmaRSMTQ0BO765uQCZuYm\nGM3CcewY8MYbOritrNSj43z09+v/3nEHIMJTCkzy5pvApz8N3HMPcPvt098vmRyEUm/jve/dwC2J\nNG/MzIMgiyl8RvG4fgVvtAHx7I7aO+8ADz6om7kI8MwzwOnT+k1DU+nri2LDhmo2csoJTuY2ydn5\nIeyewifLZPRbGz/zGX2CkVFT1WfKxO7EeWeUUohG/4gdO9aisLDQ1mPPlennLjG9Pk7mpnFqCp8s\nHgeWL7+kkU+HE/v0Eoke1NeHXW/kFByczL3M6Sl8Km1t+oQjY2eHmgdTJvZsdHS8jfe8pxLV1bm7\nohCZiZO5n+VqCp9seFg/VkN2Z/YL+sSeSo0gFEqgsnKF20uhAOE+c5tkvdfV4r5wR8Vi+u2MUzzW\nfOvzwzVP7d5Dr/eWR5A3277FHDF9H7bp9Vll5mjkJ25N4VNJp4GVzl04ISgTeyoVRQNPgUA5xszc\nDW5k4bNJJIAFC/QJR3LMpIx9cLAfeXkncP31M7zHn2gOmJl7kZem8MnicX2+VheYNLEnEjFs3MgX\nPSn3vBHqGWDa3M4LWfhs0mn9vvRl00cDucol3cjY7crMM5kMgC7U1HirmZueKZten1XeH3X8ystT\n+GTd3cCqVXqNHuK3ib2vL47GxhKEQiG3l0IBxMzcTl7Mwq1oawNuuw1Y5I/T3Xo1Y+/oeAvXXFON\nqqoq19ZA5mFmnkt+msInGxrSTzYLF7q9Esu8OLGPjAwjHB5AJOLcbiCimTAzn69JWXjLv/6r/ryX\nsnArurr03vJZ9kR7NZe0I2O3IzPv6Ylh2bJKz+wtn8ir3zu7mF6fVZzM52q6KTwW836cMplSju8t\nz6WZJ/YShEKVjk3smUwM9fXLbT8ukVXMzK3waxY+m95eXcNtt7m9EkddnrHb29gHBhIIhU7jmmtm\nuewQ0TwwM7eDn7NwK3p7gWuvdXsVjnN6Yk8koti82VvbESl4vBfwuW2e+8JbWltzuEgbpNNAQYGu\nywJTcsnLM/YatLfvHs3Y35rzPvZMJoP8/Diqq727g8WU7910TK/PKk7mY0yfwifr6gLWrAECvCd6\nrLEvW7YI27dvnNfE3tvbjcWLy7BgwYIcrpzocsHOzE3Nwq1obwc++lFfbUnMlblk7B0db+K66+oR\niURcWi2ZLqeZuYj8GMCHAVxQSm2045iOCtoUPtngIFBWBtTVub0ST7KasWcyaRQVJVFRUeH2kols\ny8wfAvBBm47lDIfPkeKrzNzi3vKJTM4lZ6ptqox9bB/72bOHUVqaQTqdzt1i58Hk7x1gfn1W2TKZ\nK6VeFBFvnsA5qFP4sWPAk0/quoeHgeuuG6+5txf40Y+AgweB++8H7rrL3bXO5g9/0Ot85hldy0c/\nqk/XOzKiT0VQWgp885vAn/yJo8uYPLG3tBxAW1sIsdhhLFxYgsbGSkQi3jlXDAWLbZn5aDN/arqY\nJaeZeZCz8Mn++q+Bpibg3nv17Xhc/1t8+MPAF78I/OmfAn/xF64u0bKVK4EtW4Cf//zSz3/968AD\nDwCtrcCK3Fyqrbe3Fy+9dAZ1deuQyWSQSPQgmexGXl4vGzvZympmbubWxHPngCeeAF56CYhE9MWJ\ng9jIOzqACxeAbdvGP5dIABtGL5ywbVvOml/WTp0CTpwAbrjh8q/t2KFfB/jVr3K2nHPnYliwoAaA\nntjLyytRV7cCVVUb0dVVg717e/Hss4dx6NBbiEbdvzQemS+nY8POnTvR1NQEAIhEIti0aROam5sB\njOdettxuaEBLfb2+PTQEdHWh5e23gfJyNG/Zou8/mnE3X3WVLbfvf/JJbFqxwrbj2XF74b59WCsC\nbNmiv55Oo/nMGeCv/gotLS2oisWwcdUqS/++999/v3PfLwu3j/3wh1gjAhlt5pd8/Y03oETwRmcn\nxt6DOZfjT8xcrdw/nU7jqaeeRXHxclxzzU0Axs/vsm1bM8rLK3H8+CEolUEotAxnz3ajtfWXqKoK\n47bbbkYkEsGLL76Ys3+/udbnt9um1dfS0oJdu3YBwMV+aYWdMUsTdMxy1TRfd2drolJANAqcPg0c\nOQL09+vsuKoKKCy07WFaWlsvNlLP+O539TT7wAP69ttv699Ynn9+zodqaWm5+IPnik9/Wmfm0ejl\nX9uyBejr0zHLPM7JPtfaOjs7sW9fH+rqrP9W42YU4/r3zmGm12c1ZrGlmYvIfwBoBlAN4AKA+5RS\nD026j/v7zHPU2D3jc5/T8dKqVbrW/fuBnTuBf/s3t1c2d4sX6xc4n3hi/HO9vcDdd+sm/sQTlt/N\nmq3XXz+GRKIBpaXz25LIjJ3mIqf7zJVSn7TjOI4T0dsQa2v1NDexsXd2mtXYz5zRu3c+/3ng+uuB\ngQGdKd98s/2P9Z//CXz1q8Avfwls3Wr/8Y8fB86eBXp69Au5SunsP53WO1seemj2Y9hkcHAQHR3D\nqK0tn/cxxjL28vJKZDIZdHX14OzZbuTltbOx07wF96fF5sbuuZjl0CFd47p1+nY8rrdkzvPX0Rl/\nlf34x4GvfQ3YtGluB332WeCznwX+/d9nXtezz+pavv1t4D3vmdtjWDCXX9M7OmLIy6uGyKyDkiW5\naOymxxCm12dVcJv5RCZO7K2t+h2elZV6a6ZSwDe+od/5abf9+4Err5z73v1kUk/YAwMz3++554Dy\n8kt35bhAKYWTJ7tQVrbakeNzYqdsBPvcLLPxc8b+l3+pm9/dd+sLNtfWAh/60KX3UQr453/WXzt5\nEvibv9FvwBkaAv7xH/X+9PPn9YuPlZX6yWDrVv2i6oULwPe+p4/zne/oyOPv/k7fjsf119auBQ4f\nBr7yFaA6i1PE1tUB73sf8ItfzP8YNojH43j55Quoq1uT08dlxh5swd5nbpexiX3rVt0cP/Yx/fHA\ngD5R1blzuvF5zYkT+sXBsYilv19PzpPt3q2/dvvtOpNub9efv/NOHXvs3Ans3QscPQp86lP6jUZ3\n3KEn6okn6GppGY9JMhngllv0/e+8U79w2dc3/1oOHtRPqDfdNP9j2OTs2RhCodyft5z72MkKPq1b\nNUsU0/L222i+7jp3J/bTp4HHHgPeeUev99e/1m/nb24GFi26/P41NTqHfuklPcGvXas/bm8fb84/\n+AFw7hz6Dx5Eyfbt+nNHjgBf/rL+OJPRDXcsAnn6aR2dHDoE7Nmjd6DMYa/sRUeO6Lfo79+va3nk\nEf1C6Pe/P/djzcJK5ppKpdDe3odIpMn2x5+L+UQxpmfKptdnFZv5fEzV2H/xCz2xu5mxL10K3HPP\npZ87fx7YuFFfiGKyrVt10/2v/9K7Xt55B3j55UvfZdnYCDz2GOJXX42L76Hdu1c3795e3WA3btQx\nS16ePn3CBz6gXxTNxpVXAo8+mt0xbBSNxpBOR5DvoXP6WG3sFAxs5tkabezNX/jC5Rm7F148TaWA\nK664/PMvvAB861vAb38L/O3fAq+/rj9fX39pLHLkCBAKoXHzZn37+ed1dHL8uI6YXnlF59m7dukn\nhLVrdWY+5tAhoLhY73X3KCtT3alTMZSU5GYf+3zM3NgbEY1Gjc3YOZVrfAHUKV548TSR0I95++2X\nf629Xf82UVmpn3RuuUVfeSiTAf7hH/RkrJR+8XH7dj3x33CDfoflY48B11yjo5lXXwUefhi48cbx\nE3bde6/O65XS2foHPpCbeh0yMDCAPXveQV2dh7aeWsQXT/0vp+8AtcL0Zj5jbudWYz9zRmffa9dm\nfSiTc8nZanv33dN4660FqKlpyN2ibLRvXwu2bWs2trGb/LMJ5PgdoDQLN/axZzL6v8u8eZp5v8hk\nMjh1qhsVFevcXkrWuI/dbJzM3eTkxB6L6XOVeGBLn591d3fjlVc6UVfnzBuFvMDUid0UjFn8xu7G\n3tYG3Hqr3o1C89ba+hY6O6tRUVHl9lJygo3de/imoRybeE7lebHzDUpDQ3oHycQ39mQp6/o8bLra\nRkZGcOZMP8rK/L29b+xc61b48Q1KJv9szgWfar1otoy9oEDvQpluYu/q0k8EHtoT7UfRaAxKVSIv\nL5gzDzN2f2HM4idTRTFTNfb2duATn9Cfp3n7wx8OI5NZjqKiAF5ycAaMYnKLmbnppmvsBQX6DIN+\nuUizRyUSCbzwwinU1U1xThu6iI3deczMcyznud1UGfuWLTpaSSb1JeJmO7XsHJicS05V2/nzMeTn\n5/6kWk6YS2Y+V17I2E3+2ZwLPnWaYKyxV1bqk16l08Dvf6+/tnixfjfmokX6RVGa1fjeck7lczEx\nY0+lUjh79gKOH29HWdlprFpVg5Url7q9RKMxZjFJWxvw1FPj18JUSp8Ma+xcK2zslsRiMbz2Wjfq\n6qY4pw1dpJTC8PAQRkaGMDSURCaTBDAEIImCgjRKSwtRURFGeXkYZWWlKC+f/6X2gozvAA2iI0f0\nBZzHiAAVFfqPUvoampzYZ9XWFkM4XOv2MjwjlRrB0FASIyNDGBlJAtBNW2QIpaUhRCK6aZeUFKOw\nsBLhcBihUMjtZQcOm7lNXD8/RH+/vijFVOctB7Ju7K7X56CJtQ0NDeH8+UHU1Ph7b/lEY+dmmUk6\nnb44YQ8Pj0/YwBAKCwUVFWGUlYVRVlaIcLgG4XAYhYWFtl0LNRsm/2zOBZu5KU6e1A3byp5oTuzT\n6uyMAajyRJOym5VYpKFBxyLhcDnC4TqEw2FPncOdpsfM3ARK6dPSimTXgJmx48UXWyGyEuGwf+ud\nLRYZy7JLSvR0zVjE25iZB0k0qt/1uSTLiycEfGLv6+tDX18+6uq8X9/EWGRkJAml9IStVBLhcN7F\nFx5LS70Xi5Az2Mxt4mpu99ZbwIIF9h5zUmNveeUVNI9d8Nmwxj72vTt7NoqCghq3l3ORXbGI6Zmy\n6fVZxWbudyMjwNGjQLWDb3AR0btkFi82dmJPp9M4fboH5eW5vzQcd4uQHZiZ+93Jk8DTT2cfscyH\nQRl7NBrF3r09qKtb6cjx5xaLhBmL0EXMzIPiyBGgrMydxzYoYz91Kori4uwuC8fdIuQmTuY2cSW3\nSySAn/5UX4DC4QmupbUVzVdZvKDx2MTe1aVvL18OXH+9s1FQFnbv3o10eiFqa6+yNAlPFYsolURe\n3rAnd4uYnimbXh8n8yB4913dxN38VTyd1hfDGBzUJ/iaqKJCXympttba/neXxOM9KC9ff0kj524R\n8htO5n6lFPDII0AoBBQVOf9YQ0O6WSeTQCqlm7NS+iyN1dX6T22tjnxKS/ULpj54kU4phRdeaEVf\nXwT5+QrTnVskHB7PshmLUC5xMjddR4eOMux84XNkZLxhDw/riX/sCbiiAqiv1w07Ehlv2EVF7v5m\nYINFiyIoKBCUlBRxtwj5Fpu5TXKe2x0/Pr8LPafT4w17LBYZa9pFRToWWbFC/7esTDfskhK0vPCC\nkbmkiKC9/V0jaxtjeqZsen1WsZn70fAwcOwYUDPNG1ysxCINDb6MRYhoaszM/eidd4Df/Q5YuFC/\n8Dg0NHUsMpZjGxaLEAUJM3OTnT2rm3Zf3/hukbFYpLRU7+vmi3REgWLLfjERuVlEjonIcRH5ezuO\n6Tc5vQ7htdcCn/888NnPAn/+5/r26tU6Oikrc6SRm3ydRZNrA1hfUGTdzEUkD8D/BvBBAFcCuFNE\n1mZ7XJrBggXMt4noElln5iJyLYD7lFIfGr39dQBKKfVPk+7HzJyIaI6sZuZ2xCyNANom3G4f/RwR\nEeWIHS+ATvWMMeUIvnPnTjQ1NQEAIpEINm3adHF/6Fju5dfb999/v1H1BKm+iZmrF9bD+oJdX0tL\nC3bt2gUAF/ulFXbFLP9LKXXz6O1Axiwthr9xweT6TK4NYH1+ZzVmsaOZ5wN4E8BNAM4BeA3AnUqp\nNybdz+i8tWJfAAAFUUlEQVRmTkTkhJztM1dKpUXkSwB2Q2fwP57cyImIyFm27DNXSj2jlFqjlFql\nlPq2Hcf0m4m5nYlMrs/k2gDWFxTePck0ERFZxnOzEBF5WC73mRMRkcvYzG1iem5ncn0m1wawvqBg\nMyciMgAzcyIiD2NmTkQUIGzmNjE9tzO5PpNrA1hfULCZExEZgJk5EZGHMTMnIgoQNnObmJ7bmVyf\nybUBrC8o2MyJiAzAzJyIyMOYmRMRBQibuU1Mz+1Mrs/k2gDWFxRs5kREBmBmTkTkYczMiYgChM3c\nJqbndibXZ3JtAOsLCjZzIiIDMDMnIvIwZuZERAHCZm4T03M7k+szuTaA9QUFmzkRkQGYmRMReRgz\ncyKiAGEzt4npuZ3J9ZlcG8D6goLNnIjIAMzMiYg8jJk5EVGAsJnbxPTczuT6TK4NYH1BwWZORGQA\nZuZERB7GzJyIKECyauYi8jEROSwiaRHZYtei/Mj03M7k+kyuDWB9QZHtZN4K4KMA9tiwFl87ePCg\n20twlMn1mVwbwPqCoiCbv6yUehMARGTWPMd08Xjc7SU4yuT6TK4NYH1BwcyciMgAs07mIvJ7APUT\nPwVAAfgfSqmnnFqY35w8edLtJTjK5PpMrg1gfUFhy9ZEEfl/AL6qlNo/w324L5GIaB6sbE3MKjOf\nZMYHs7IYIiKan2y3Jt4mIm0ArgXwaxH5rT3LIiKiucjZO0CJiMg5ju9mEZGbReSYiBwXkb93+vFy\nTUR+LCIXROSPbq/FbiKyWESeE5GjItIqIne5vSY7iUihiLwqIgdG67vP7TXZTUTyRGS/iPzK7bU4\nQUROisih0e/ha26vx04iUiEiPxeRN0TkiIhcM+P9nZzMRSQPwHEANwE4C2AvgE8opY459qA5JiLv\nA5AA8LBSaqPb67GTiCwEsFApdVBESgG8DuBWw75/xUqpARHJB/ASgLuUUsY0BRH5MoCtAMqVUh9x\nez12E5F3AWxVSnW7vRa7icguAHuUUg+JSAGAYqVU73T3d3oyfw+At5RSp5RSIwAeBXCrw4+ZU0qp\nFwEY94MEAEqp80qpg6MfJwC8AaDR3VXZSyk1MPphIfSGAGNyRxFZDODPADzo9locJDDw/TIiUgbg\nvymlHgIApVRqpkYOOP+P0AigbcLtdhjWDIJCRJoAbALwqrsrsddoDHEAwHkAv1dK7XV7TTb6HoB7\nYNAT1BQUgN+JyF4R+bzbi7HRCgBREXloNCb7kYgUzfQXnG7mU21HNPkHy0ijEcvjAO4endCNoZTK\nKKU2A1gM4BoRWe/2muwgIrcAuDD6m5Vglq3DPna9Umob9G8g/3009jRBAYAtAH6olNoCYADA12f6\nC04383YASyfcXgydnZNPjGZ1jwP4qVLqSbfX45TRX2FbANzs8lLs8l4AHxnNlH8GYIeIPOzymmyn\nlDo/+t9OAE9AR7smaAfQppTaN3r7cejmPi2nm/leAFeIyDIRCQH4BAATX1U3efL5vwCOKqW+7/ZC\n7CYiNSJSMfpxEYD3AzDixV2l1L1KqaVKqRXQ/989p5T6jNvrspOIFI/+1ggRKQHwAQCH3V2VPZRS\nFwC0icjq0U/dBODoTH/HzneATrWgtIh8CcBu6CeOHyul3nDyMXNNRP4DQDOAahE5DeC+sRct/E5E\n3gvgUwBaR3NlBeBepdQz7q7MNg0AfjK66yoPwGNKqaddXhNZVw/gidFThRQAeEQptdvlNdnpLgCP\niMgCAO8C+NxMd+abhoiIDGDclh4ioiBiMyciMgCbORGRAdjMiYgMwGZORGQANnMiIgOwmRMRGYDN\nnIjIAP8fgrAarPBEMFgAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F_scale = np.array([\n", " [0.5, 0],\n", " [0, 0.5]\n", " ])\n", "plot_transformation(P, F_scale.dot(P), \"$P$\", \"$F_{scale} \\cdot P$\",\n", " axis=[0, 6, -1, 4])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We rescaled the polygon by a factor of 1/2 on both vertical and horizontal axes so the surface area of the resulting polygon is 1/4$^{th}$ of the original polygon. Let's compute the determinant and check that:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.25" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.det(F_scale)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Correct!\n", "\n", "The determinant can actually be negative, when the transformation results in a \"flipped over\" version of the original polygon (eg. a left hand glove becomes a right hand glove). For example, the determinant of the `F_reflect` matrix is -1 because the surface area is preserved but the polygon gets flipped over:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.det(F_reflect)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Composing linear transformations\n", "Several linear transformations can be chained simply by performing multiple dot products in a row. For example, to perform a squeeze mapping followed by a shear mapping, just write:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [], "source": [ "P_squeezed_then_sheared = F_shear.dot(F_squeeze.dot(P))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the dot product is associative, the following code is equivalent:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [], "source": [ "P_squeezed_then_sheared = (F_shear.dot(F_squeeze)).dot(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the order of the transformations is the reverse of the dot product order.\n", "\n", "If we are going to perform this composition of linear transformations more than once, we might as well save the composition matrix like this:" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [ "F_squeeze_then_shear = F_shear.dot(F_squeeze)\n", "P_squeezed_then_sheared = F_squeeze_then_shear.dot(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From now on we can perform both transformations in just one dot product, which can lead to a very significant performance boost." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if you want to perform the inverse of this double transformation? Well, if you squeezed and then you sheared, and you want to undo what you have done, it should be obvious that you should unshear first and then unsqueeze. In more mathematical terms, given two invertible (aka nonsingular) matrices $Q$ and $R$:\n", "\n", "$(Q \\cdot R)^{-1} = R^{-1} \\cdot Q^{-1}$\n", "\n", "And in NumPy:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ True, True],\n", " [ True, True]], dtype=bool)" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LA.inv(F_shear.dot(F_squeeze)) == LA.inv(F_squeeze).dot(LA.inv(F_shear))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Singular Value Decomposition\n", "It turns out that any $m \\times n$ matrix $M$ can be decomposed into the dot product of three simple matrices:\n", "* a rotation matrix $U$ (an $m \\times m$ orthogonal matrix)\n", "* a scaling & projecting matrix $\\Sigma$ (an $m \\times n$ diagonal matrix)\n", "* and another rotation matrix $V^T$ (an $n \\times n$ orthogonal matrix)\n", "\n", "$M = U \\cdot \\Sigma \\cdot V^{T}$\n", "\n", "For example, let's decompose the shear transformation:" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.89442719, -0.4472136 ],\n", " [ 0.4472136 , 0.89442719]])" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U, S_diag, V_T = LA.svd(F_shear) # note: in python 3 you can rename S_diag to Σ_diag\n", "U" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2. , 0.5])" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S_diag" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this is just a 1D array containing the diagonal values of Σ. To get the actual matrix Σ, we can use NumPy's `diag` function:" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 2. , 0. ],\n", " [ 0. , 0.5]])" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = np.diag(S_diag)\n", "S" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's check that $U \\cdot \\Sigma \\cdot V^T$ is indeed equal to `F_shear`:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , 1.5],\n", " [ 0. , 1. ]])" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.dot(np.diag(S_diag)).dot(V_T)" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , 1.5],\n", " [ 0. , 1. ]])" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F_shear" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It worked like a charm. Let's apply these transformations one by one (in reverse order) on the unit square to understand what's going on. First, let's apply the first rotation $V^T$:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nIiIl7P8DykDSSJg1BVAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_transformation(Square, V_T.dot(Square), \"$Square$\", \"$V^T \\cdot Square$\",\n", " axis=[-0.5, 3.5 , -1.5, 1.5])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's rescale along the vertical and horizontal axes using $\\Sigma$:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAEACAYAAABVtcpZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8XGW18PHfyv3W3C9Nm7RpofdSCq1Qrg2CCugLqCiX\no1AVRc9BRTgIBz1vxeNB0KMclYOKLyrgB6EKCtUjFGjDrVBaSnpL7yVtk7ZJm6RJc08mz/vHnmTS\ndCaZzOzM7J1Z388nn8ye/WTvlZ3M8+y91r6IMQallFKxKS7aASillIoeHQSUUiqG6SCglFIxTAcB\npZSKYToIKKVUDNNBQCmlYpgtg4CIPCYidSKyOcD8pSJyXEQ2er++a8d6lVJKhSfBpuX8DvgF8MQw\nbV43xlxl0/qUUkrZwJYjAWPMm0DTCM3EjnUppZSyTyRrAktE5H0R+buIzI3gepVSSgVgVzpoJO8B\nU40x7SJyBfBXYGaE1q2UUiqAiAwCxpjWQa//ISKPiEiuMaZxaFsR0ZsZKaXUKBljQkq525kOEgLk\n/UWkaNDrcwDxNwD0M8Y4+mv58uVRj0Hj1Dg1To2z/yscthwJiMhTQDmQJyIHgOVAEmCMMY8C14rI\n14AeoAO4zo71Rkt1dXW0QwiKxmkvjdNeGqcz2DIIGGNuHGH+/wD/Y8e6lFJK2UevGA7BsmXLoh1C\nUDROe2mc9tI4nUHCzSfZTUSM02JSSiknExGMAwrDMaOioiLaIQRF47SXxmkvjdMZdBBQSqkYpukg\npZRyOU0HKaWUCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SX\nxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0J\nKKWUCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkvjdMZ\ndBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYZktNQEQeAz4B1BljFgRo\n83PgCqANWGaMqQzQTmsCSik1Ck6oCfwO+FigmSJyBXCaMWYGcCvwK5vWq5RSKgy2DALGmDeBpmGa\nXA084W27DsgSkSI71h0NbskRapz20jjtpXE6Q6RqApOBg4Oma73vKaWUiiLbrhMQkanASn81ARH5\nG3C/MWatd/oV4C5jzPt+2mpNQCmlRiGcmkCC3cEEUAOUDpouAQ4Farxs2TLKysoAyM7OZuHChZSX\nlwO+QzOd1mmd1ulYne5/XV1dTdiMMbZ8AWXAlgDzrgT+7n29BHhnmOUYp1uzZk20QwiKxmkvjdNe\nGqd9vP1mSH23LUcCIvIUUA7kicgBYDmQ5A3sUWPM/4rIlSKyB+sU0S/YsV6llFLh0XsHKaWUyznh\nOgGllFIupINACAYXZ5xM47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkv\njdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWU\nCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkvjdMZdBBQ\nSqkYpjUBpZRyOa0JKKWUCokOAiFwS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCokOAiFw\nS45Q47SXxmkvjdMZdBBQSqkYpjUBpZRyOa0JKKWUCoktg4CIXC4iO0Rkl4jc7Wf+zSJSLyIbvV9f\ntGO90eKWHKHGaS+N014apzMkhLsAEYkDHgYuBQ4B60XkeWPMjiFNnzbGfCPc9SmllLJP2DUBEVkC\nLDfGXOGdvgcwxpgHB7W5GVhsjPl6EMvTmoBSSo1CtGsCk4GDg6ZrvO8N9SkRqRSRFSJSYsN6lVJK\nhSnsdBDgb/QZuiv/AvCUMaZHRG4FHsdKH/m1bNkyysrKAMjOzmbhwoWUl5cDvvxcNKcrKyu5/fbb\nHRNPoOnBuUwnxBNoWrenbk8nxBNo2onbs/91dXU1YTPGhPUFLAFeHDR9D3D3MO3jgOPDzDdOt2bN\nmmiHEBSN014ap700Tvt4+82Q+nA7agLxwE6sPfvDwLvADcaY7YPaTDTGHPG+/iRwlzHm/ADLM+HG\npJRSsSScmkDY6SBjjEdEbgNWYe3lP2aM2S4i9wHrjTF/A74hIlcBPUAjsCzc9Srna2lpobe3l9zc\n3GiHopQKwJbrBIwxLxpjZhljZhhjHvC+t9w7AGCMudcYM98Yc5Yx5lJjzC471hstg/NyThaNOPv6\n+jh27BjvvlvFW2/VsG7dQdrb24f9Gd2e9tI47eWWOENlR2FYKXp7e6mrO8qePUdpb08jLa2EwsJM\nmpqOsmdPDQsWzIx2iEopP/TeQSosHR0d1NbWs29fEx5PDllZRSQnpwzMN8ZQV1fFBRdMJjs7O4qR\nKjV+hVMT0EFAhaSlpYX9++uore1ApIDs7AISEvwfWLa2tpCUdIAlS+YhEtL/qVJqGNG+WCzmuCVH\naHecQ/P99fW55OXNJz+/OOAAAJCRkUlTUzL19UcjEudY0TjtpXE6g9YE1IgC5ftHIyurhKqqXeTl\n5Q47YCilIkvTQSqgkfL9o3X06AHmzIlj6lS9a4hSdtKagLLVaPL9o9Hb20NzcxVLl84mOTnZhkiV\nUqA1gYhzS45wNHGGmu8fjYSERKCIvXtrQo4zmjROe2mczqDJ2RhnR75/NHJyCtm/fxulpSeYMGHC\nmK1HKRUcTQfFKLvz/aPR3NxIZmYdixfPicj6lBrvonrvIOUup+b750f8bJ2srFyOHKmnoaGBvLy8\niK5bKXUyrQmEwC05wv44I5HvH62srFK2bz9EX1+f67an02mc9nJLnKHSI4FxzOPxUFt7OGL5/tFI\nTU2nvj6Dw4froh2KUjFNawLjUDTz/aPR09NNa+t2li6dS2JiYrTDUcq1tCagAGfk+0cjMTEJjyef\n6upaZswoi3Y4SsUkrQmEwEk5wuHy/ZWVb0Y7vBHl5EzkL395dcRnDjhBWH93Y6CrC44fhyNH4IMP\nYOtWeOst+Pvf4emn4a9/hf37oa8venFGkMbpDM7dTVTDivT5/WMlPj6e+Pg8dz9zwBjo7oaODujs\ntL63tUFzs9XpnzgBLS3g8UBcnO9nRCApyffV2moNCJmZcPbZcNppoFdWqzGmNQGXcUu+fzSMMdTX\nb+f88yc575kDdnXwSUm++SPp6ICGBkhMhDPPhNmzQS+sU8PQewfFgLG6n49TROWZA9Ho4EejpweO\nHbPWP3MmLFgABQX2r0e5ng4CEVZRUUF5efmYr6evr4/Gxkb27aunoQGSkorIzMwhLsgOZ8OGChYv\nLh/bIG3QH2dd3W4WLcqiqKgw/IWOQQdfsWUL5WecEX5so9XXZx0ZdHZCcbGVKiotDTjwROr/M1wa\np3307KBxZrzk+0cr6GcO2NXBFxWNzR683eLifEcALS1aN1C20iMBBxmP+f7ROlq/nzmn9TK1MM+Z\nKRqn0LqBGkTTQS433vP9A4xBerqJ6+pAujqJ6+ogrqON+NZm4luPE992Ak4cp7PtIDNmFlsXkMVi\nBz8aWjdQ6CAQcXbkCMPN9wcjojWBIDr4uLYWpM+DkTis/1YDCGtr93HujAWYhCRMYhIn2prJy+tk\nypTiyMQepKjVBIIxqG5Q0dBA+U03DVs3cAI35NrBHXFqTcBFXJnvD6OD70u0OnaTkERvrv8cfF9z\nA33pvm2QnpHF0aPN5Bd0kJaaGqnf0t0G1w1qa7VuoIKmRwIR4th8v00dvEm0N0XT3t5KamoTM2aU\n2rZMx+vpgX/+Z1iyxMrvv/IKTJoEc+dCfb11pfEPfhD88rRuEDM0HeRgUc33O7SDD1ZTUw2zZmWS\nmenwIyW7rFsHubkwY4Y1fcstcPfdvulnn4VPf3r0y9W6wbin6aAIGylH6C/fn5dnb74/mA7+3ar1\nnFd6ekgpmkhat2cL555+aq49PT2fmpojzJ6dYe+2C9GY1wRaWuDcc63XR49a09On++bn5we1mFPi\nTEy0ri/o67PuTbRzZ1DXG4w1N+TawT1xhsqWQUBELgf+G+uGdI8ZYx4cMj8JeAJYBBwDrjPGHLBj\n3U5iW77fpj14z4QcegpL7P0lIygpKYXm5lSamo6Tl5c7Niu55Rarw1240NoL79fXZ52aum+flVK5\n9lqrzWg9/DBs2ABNTVBWBh/6EHzuc775vb3w/e/Dpk3W3vnRo3DjjbBtG8yaBfHxvrZLl4b8awJW\nZ795s7WupCQrXVRcDJ/9LLz3Htx/f3jLV64UdjpIROKAXcClwCFgPXC9MWbHoDZfA84wxvyziFwH\nfNIYc32A5bkuHTSqfL/LUzSR1tvbQ2dnDfPnl45NGm3TJli+HObNg//8T/9tfv97ayC4887Q1vHi\ni/CrX8FDD8G0aafOb2iAX//aSv30d/qPPGINStf7/ZiE5qGHrIFm8CC0di389Kfwla/ATTdp3cCl\nop0OOgfYbYzZ7w3maeBqYMegNlcDy72v/ww8bMN6o+6UfH/WPBJNn9XBnzhu+1k0sSghIZG+vkzq\n6xuYNKnI/hWceSZcfbV1G+cVK6y94qFuugl+/OPQ11FUZF3vcPiw/0FgxQq4/faT9/q3bYNbbw19\nnUNVVFi3r/7Wt05+//zz4fHHrWL0++9bRy1aN4gpdgwCk4GDg6ZrsAYGv22MMR4ROS4iucaYRhvW\nH3Ern3qK0rR8Wg53kNqVwHQMCe1VjuvgA+XanWakODMysjl8+AB5eV0kj8Wpjp//vJUmefppOOss\nXyG2X1wcFBaGXhOYONH6XufnUZpr1lgporQ033stLdaZQLNmjX5dBKhdvP02FAa4J9P8+dbppJmZ\nEa0buCXX7pY4Q2XHIODvEGRoPmdoG/HTZsCyZcsoKysDIDs7m4ULFw78Efof8BDN6df++g9uKZhN\ngYE3ThynLymJc2cspDe3iHX7tgEMdGrr9mzR6RGmq2r3jdh+3sQpHDp0jP2t1n5DfydXsWWLPdN3\n3gl33EH7/fez4bbbuHjRopPn33wzbNsW0vLF42FpXBwcOXLy/KYmDr77LnuvvJJyGGifv20b86dP\nh+TkkNZXuW/fqfNTUuCNN9j96KPUL1jABUuWDMyPO/98Lvau/42NGyl79VVKS0qgrY0NK1ZQtnEj\n+c88Azt38sFLL5G5bRt5L74IOTlUVFRQsGYN8zZuhJUrfZ+XRYtg+XKqjx0jrreXKVdeCT/5CRUP\nPWTNLy+n5M9/pvahh0g+doz8r38d3nyT5ooKWubNo/SZZwB4bdUqpjzzDNOysqCggNp169j35S9z\n0cc/bsUfgc97ZWWlo/qffhUVFVRXVxMuO2oCS4DvGWMu907fA5jBxWER+Ye3zToRiQcOG2P87pa4\noSZQV1fPpooDTDnRQerebSBCb1YeJim2L8jp6o3j8gfK+cgZR8hO6+HZd0spK2hj8fQGahrSONiY\nxhNfeyekZRtjaG4+yOzZuWRkZNgcudeLL8IvfwmXXGKlZ+x0yy0weTLcd5/vvUcesVJN/b/Pnj2w\nfr311dkJF18Ml15qT1qmpga++13r/kvGWNcfLF0Kn/qUVSQGq1D8ne9Y673mGuu9e++17td0661W\nuuiuu6yawoMP+tpce621jKeesqbb2qxteP31cMcd1nsXXmj9Ths2WNNVVdbriy+2zoD60pfgN7+B\nj37UOmL5wx+sh+z0L6e/HvPcc1ba7Oqrw98m40i0awLrgdNFZCpwGLgeuGFIm5XAzcA64DPAahvW\nGzWFhQVklR2lrnMGE+YsIvnALtJ2bCSuqQtPZjZ9qWPUSTncmzsK+NlN77FgSjMAK96Zwjcv3zEw\n/etXTwt52SJCSko+NTVHmTUrfWyeOXD55VahNCvL/mVPnGilePpVVMCiRb4BAOD0062vG4Z+fGxQ\nUgKPPmqdBbR5M1RWwh//aBWl/+VfrDZPPmndnbW/cwcrDTR/vpXK+vjHYeVKa7Dq6rLOZCoogDfe\nOPnMonvvhfZ23wAAkJIC553nm25stAagV16B9HT42c+s91et8rW54w4rNdY/ABw5Yq3/gQfs3TYx\nLuxEnzHGA9wGrAK2AU8bY7aLyH0i8glvs8eAfBHZDdwO3BPueqPptddeY/bsEtraauhLTqVz5kIa\nr/w8LUs+AghJdQeJb2my9riiqD+VEimNbUkDHf6hplSa2pKYV9I8ML84u9PvzwUbZ0pKGq2tiRxv\nbh65cSh277aKuF/4wqnzjh4dSK2cZNMmq72/eYNNnGh1msZYHeDOnb5rAsLhZ/2nxNnp3e5JSVZH\nfOut1hHPuedagx5Ye++rVll75v16eqw4582zjkhyc631LVhgtf/Tn+DnP7cuROvPmTc3W3v0N954\n8nLeftvaq+934YVUbNhg1UQuuODkmghYnf+TT1qF9B//2Bpk/vQn+MlPrL9RBOkzhoNgjHkRmDXk\nveWDXncBfk67cK+srCxKSuqorz9GTk4BJCTSXXo63SWnkXjsMKk7K0k6XI1JSKQ3u+DkMz9c5Lsr\nFlBRVUj9iRRmFbdwydw67rhy58D8Ho/w5d+cy9rd+UzO6eBwUyrfuHwX6/flsnBqE/GDdjOuWlQb\ndjwvVZ3N289PYHpJIr198Uwp6ODys+t57u1ivv9PO0deQCC1tfDCC4HTQM8/77/T7u62OtmuruGX\nX1RkFV3r663O7OabQ491NOuvr7ceZv/JT54678wzresgALZvt65ZWLDAN3/nTqsDnzvX997atXDd\ndb4U1XPPQU6O1cl3d1sDaVcXfPjDvp9Zt85azkUXnRrD6tUnn7Lab9cuazn33OMbYNSY0CuGQ9Bf\npJkxo5RDh3bh8eQS39/Ji9BTMImegknEtzSRsndr1OoGdpwZ9IPPbubpt6ew/M8L+NENlcyZ3HLS\n/MR4wwPXV/L95+bz85vfIyHeOvrZsC+XxdMbbI3z208tZGJ2B/dd8yYlJVBUVMD/bijkgrsv4Jlv\nvze6X2ywpiZrr/Nb3/I/WHd0wJEj/s8M+tCHrLTKSCZOtI4CnnkGFi+271x8P+s/Kc7KSut2Ef5s\n3AiXXWa97umxvk+Z4pu/ebOVn++/iK611UofzZzpa7Nvn3VGVVKS1WFPnnzqctassc4ymjDBqiXc\nfbcV57x5Vm1g8BFCvwkTrFuI959ZNdiWLRDBu7mO5zODwIZ0UCxLTU3l9NOzaWo67He+JzOHtrMu\nouETN9F6xrnEtbeQWFdDXEdrhCMNT0luOwY40JDmd/4vX5nBj258f2AAANiwL48PTbfvDODn35vM\n9tpM7rhyJxkZuRw61Ep3dzdXLq5nUm4n5fODG3BO0dZmpUa++lX/d9o8csRKQQxNV4xWf2fW2Wmd\nmx8pmzZZe9uD6xHGWKfDdndbRV2wTkdNSPCljvbts/Lv8+b5fi452boFRb/aWqtYPHWqlb4pLbXq\nHAkJ8MQT8Oqr1rp/+1vrCKP/aXD9Vq+2aiKLF58a96xZ1uCydavvvf6rqxtdeWa5Y+mRQAgGnzc8\ndeok9u+voru7gKQAe/kmJY3OmQvpnD6PpMP7Sa/aQFLdQTypGXgmZFt7PGPArusESvPaATjoZxB4\nfsNkLplbR0aKb2+zqS2RAw1pLJzaZFucqzYXMznX6kCso65sjhxpYMqUYpbObyAjNcDe7kh+9CM4\neBC+972T3++/bcSxY9bf59prw7t3UHEx5OVZg80YOyXO//gP62iho8PqxDs6rCuDv/c935FPbi58\n85vWhWOTJkFqqnV0MHgQSEyEr33NOpqZPh2ys62i8iuvWB3zTTdZy/vWt6z6wrp11s98/evWxXjf\n/jb8678OLG7v6tWcdt11ga9BePZZ66hh2zZruX191jq8p49Hil4noIaVmJjI7NmFbN5cS2Hh9OEb\nu7RuMDmng3gxHGxIP+n9oy3JbKvN4t6rq056f/3ePOZObiYlqc+2GNKTe/nb+5N58o0yrjzrEDmD\nnjnwsy9vG2h3oj2e5X+cRUaKh55e4doLDvMfz8zk6bve4383FLLtwATW7sjlqX/dSE5GD9x3Hyve\nLObJNSWs/Pf1fpfT3SvMn3yC+x6exO5f+9r89/PT2HUog5qGFG68uJY3q3LZuC+L82c38V9ftLZJ\nV08cP37uNBpbEym44nVqnkrhhzftIDOt17ZtM6y77rK+33bbyG0vusiXt9+719rzHlwPAKtAfOml\nJ7839Mjmggusr37NzdZpnpmZ1ummXV2QnMzBG27gtOE616lTrSMWNaY0HRSCoXsFxcVFTJjQRnt7\nkGkeb92g5cIrafrYDXSWzSax4QiJRw8h3SMUGEfBrquFE+INE7M7TzkS+PlLM7nto7sGprcezOIX\nL83kl6/MoKUjkYdXzeBQ08gPhQkmzq9etpvc9C5+8Nf5nLf8o1zx4KU89sZS9n3QRLr3KKS1I54P\nf/d8SvI6+f4/7eSHN+/gzt/Opbo+lcYTiVTXp/Hv1++muj6V17bmDSx7xZuTmJDq65TbOuO59N/P\nG1jOAzfv4FcvlpGV7rsfVNWBDHIn9PDtT+3hb+uLeHVzPg9/dSsZKR6ONCUPxHPh3ReQmuThp1+q\n4t8+s4dLFxxjzWbfuseCLXc63b3bOlV20qTwl5WVZaWKkpKsU2OffBLWr7cuKHOB8XwUAHokYIu4\nuDjmzp3MO+/UkJY2e1Q/2183aHf49QaleW0n1QSef28y5XPqyRzUec4vbWZ+aTNf/9guf4sIy/TC\nNl79zmpe217IO3vyeXNnAb9acwZHjsfz+zsqyczM5N4nZ9PRHccd1+wb+Ln4OMNFcxt5ubKAZZce\nZPMHE9hzOJ1zZvhSVW9sy+P+z28fmL73ydm0d8WftJyUJA/nzfblohtbk/jUeYd5ZVMB6SmegaOR\nVd/3XQx3x2PzaOlI4M5PWss50pTMyvVFPHCTb12OtWMHzJlj7zJTU63rFXp69D5FDqJHAiHwd95w\nbm4uRUWG5ubQilb9dQM7rzew8zqB0tx2DjWlYgzUtySzaX8Ol873cy+cUVq7K59z/n0p6/YE3jtu\n77LSZMmJfXx0wRH+76e2surf1nDZvCOs3nE6Bw820HQijv+3aio3Xuw7DbW7R3hnZw4XzWvg5ktr\nyJ3Qw+9encKHFxxjUp51xFV1IINjJ5L48IJjADS3JfCbl05eTk+v8PaOHPIm+M5AunBuIxmpHtZs\nyeOC2Y2kJZ9ck2hpT+DJihKmFbbz4+dO4/4Vp/Ont4r5yRerKMrpDnu7Dcfv9QzB+uAD6+llr79u\nHQ089ph9gfXzPt+goqHBuk/Rn/4Ef/mL9brPvhSiXfQ6ARW0WbNKeeOND+jryw79ISgOrRuU5rXj\n6YujtimVX748g7s+Yc/ebFdvHF09SXR0+/+9ahtT+cemYm65ZN8p886feYyq2iw6O9N4aX0yXb1x\nA505wDs7c+jsieeiub6B+c9ri/m/1/mOVF7flseU/A6mTbSKzmt35J6ynHW7cujxxLGg7CBDLodh\n9eZ8Pldec0psu2rT6eqJ455r91B+RohnLkXDtGnW7SUiYfBzkZubfc9FXrTIKjzrc5EjQo8EQhAo\nR5iRkcG0aek0NdWHvxIb6gZ23kG0NM86TfR/Vs3kotlHyU7vsWW5l8ytZ9MDL1M+1/82e2tXAZ4+\n//+mr+8o4NPnHCA9PZdDR6xTG+dNOTEwf/XmfKYVtlOca22vptZEahtSOGfmcd8ytuUOdPj3rzid\nzu64U5azZnMeZ09v5srFs3jwWd+tL442J1F1cAKX+OnkJ6T2Wqe555z6t9pSPbb36x/Tp5/Z6KQ4\nA9QNOHEi4M9HynivCeggYLNp0yYjUkdvrz2dJDjjeoPSvDYA2rvjufxM/9dFjIW1u/J5bn0JBxt8\nBWZj4BcvzaCrN56vXraHhIRE5k1uIyneQ2undXBbuS+Tn62cxsXzfB10WrKH5MQ+xHsD21216ax6\nv5AzprZQXZdKQVY3581uIiXx5OX89pUpLChrobtH6OjyHbGs3pxPRkovi0/3DSr9ZpW0cdb0Zrbu\n93X4vR7h+0/PoLE1yd6NNJ701w1yc626wR/+YF1vcPRotCMbt/RB8yEY6bzh/ftrqKryUFg4dWwC\n6O0ZuN4goaUx4PUGdj5PoLk9kf/zX0v56x2vk5thb057uDhvf/Js/u2qbfzipVm0diaQlNhHW2cC\nZ5U18oWl+wZuS9HX5+HZt5PZenQuc0o7mJDayz1PzOGRr27hC5f5Hnfx+Ksl/G19EWdNb6Ywu5vc\njG5++8oU5pSe4Ic37SAh3vDnt4pZ+W4RMya1kZ3ew4VzG/n27+eSlfYBD93STEm+ddTxo2dPY8/h\ndB69bbPf2PfXp3L343OYU9JKfJyhz8BNl9RQVtTht71dxvxZyDYJKs6+Pusq5c7OqD0X2Q3XCYRz\nF1EdBEIw0j+Fx+Ph9de3kpQ0k5SUkU+RDJkxw9YNxstDZYLV2tpMVlYr06ZN5v29mSy+82J2PrKa\n0ye12xDlOOtcHSCoOHt7rSuNu7utwaC9HU47Da66yjpqiEScOghElhsGgWDU1dXz3nvNFBXNGLmx\nDfrvU5SyrwqMwZOdH3PPNxj8zIGn3pzL8j/O4vDjL0c7LBVIfwff0+Pr6ME6ou3vAxITfU89y8qy\nvtLTrXsUOfTiymiI9vMElB+FhQXk5R2ltbWZjIwxuD/9EP6vN+jEk5njqOsNxtLgZw6s3ZHDhXP0\nHjNRM5oOvqDg5A4+JcXay09JOfleRWpM6JFACII9PGxubuatt2ooLJw7Ng9BGU5vD5teXkF5XPyw\ndQMnsDNttb02k/9aOZV39pUyMaeLT59/mJ9+qWrkHwzCuEqzhCOcPfhBHXzFW285Ps0C4z8dpEcC\nY+iUZw5EUkIiPQWTaVq01FHXG4y1OZNb+OUXN9Db+wLz5k3x3eJbBUf34GOOHgmMsY6ODl57bRe5\nufOj3iFUMtVIAAAPH0lEQVTFUt2gufnowDMHlJdNe/DawTuPFoYdbs+e/ezdG09+fkm0QwFAOtt9\ndYOu8Vk38Hg8tLcfYN68ySQlxcB5+drBxzQdBCJstDnCnp4eXn+9irS02QGfOTAWNmyoYPHi8sAN\ngrzeYKyN1amsJ040kZfXyZQpxbYsL2o1gVF28BV791J+ySWO7+DdkGsHd8SpNQGHG9UzByLJofcp\nskv6oGcOpEXonPJRG4scfEWF/XcAVeOWHglESF9fH2vXbsOYaaSlOTf1Mt7qBu3traSmNjFjRmnk\nV64pGhUhmg5yicbGRt55p56iotE9cyAaxlPdoKmphlmzMsnMzLRvodrBKwfRQSDCwskRbtiwnZaW\nIrKycu0Nyu+6RqgJBCMCdYOxvr1Fd3cnxhxmzpypwd3iO0AHX7FrF+UzZ1ptHNzBuyGHDRqnnbQm\n4CKzZ9vwzIFIGgd1g6SkFJqb02hqOk5eVmboOfiiIrjsMt2DV+OKHglEwfbt+zh4MI28vInRDiUk\njq0beHqRnm6kt4e4nm6kt9vq10Xo6+2hq+swM+ZOISE315F78EqFStNBLtPV1cXrr+8gM3MuCQnu\n7XAiWjcYpoMX7/+LSUjEk5GJJz0TT0YWnows+lLTMUkp9CWncvREA9NmwowZZWMTo1JRooNAhNmR\nIxzzZw5gU00gGGHWDdbtqmTJlJlhdfB9ySkwwoDq8XhobNzGxRefTlpa2qh/TTfkhkHjtJsb4tSa\ngAuVlBSzb99WOjsLx/aZA5EwXN0gKw/p7Rm2g49vbYG4OHpzCkLu4IMRHx9PQkIxe/bUsGDBzLCX\np9R4ENaRgIjkAM8AU4Fq4LPGmGY/7TzAJkCA/caYa4ZZpuOPBOwS6WcORFJ/3SC5Zi99qelh7cHb\npaenm+PH60lMrKe8/Myo38tJKbtELR0kIg8CDcaYH4nI3UCOMeYeP+1ajDFBnaQdS4OAMYZ166ro\n6iqJyDMHYlVnZzstLXUkJTVz2ml5FBcXkpzsgEK2UjYJZxAI9xzFq4HHva8fBwLt4TvvJvZhqKio\nsGU5IsKcOSW0tdUwFgPfhg0Vti9zLIxFnMYYTpw4Tl3dTozZy1lnpVFefgZlZaUhDwB2/d3HmsZp\nL7fEGapwawKFxpg6AGPMEREJdN/eZBF5F+gFHjTGPB/meseNrKwsSkvrqauLwjMHxqG+vj6OHz9G\nb289hYUJnHlmEdnZ2ZF/qI9SLjHiICAiLwNFg98CDPDdUaxnineQmAasFpHNxpgPAjVetmwZZWVl\nAGRnZ7Nw4cKB6nz/qBzt6X52LK+rq4u+vol4PLm8//4bAANn9fTvJYcyvXhxeVg/H8npfqH+/Jln\nnk9z81E2bfoHRUVpfPrTV5GRkWHr37+8vNwx/3+R/P8cq2ndnuHFU1FRQXV1NeEKtyawHSg3xtSJ\nyERgjTFm2NsXisjvgJXGmOcCzI+ZmsBge/bsZ8+eeAoKnPHMAbfQfL9S0a0JvAAs876+GTglzSMi\n2SKS5H2dD5wP2PPQ1ygZixzh1KmTSExsoLu7y7ZljteawFjk+4Phltywxmkvt8QZqnBrAg8CK0Tk\ni8AB4DMAIrIIuNUY8xVgDvBr72miccAPjTE7wlzvuOPYZw44iOb7lbKfXjHsIG555kCk9fR009x8\nFDjGlCkTKC0tJCNDt49S/fS2EeOIm545MNY0369UcKJZE4hJY5kjzM3NpagImpsbw16WG2sC0cr3\nB8MtuWGN015uiTNUeu8gB5o1q8Rdzxywgeb7lYoOTQc5lNufORAszfcrFT69i+g4NH36ZGpqdtDb\nm+fqZw4EMjjfP2tWHsXFs6Oe7lEqFsVGrsFmkcgRJicnM3NmHo2Nh0JehtNqAoHy/dXVe10xALgl\nN6xx2sstcYZKjwQcbLw8c0Dz/Uo5l9YEHK6+/igbNhx35TMHNN+vVGRoTWAcKyjIJze3ntbWZtc8\nc0Dz/Uq5h9YEQhDJHGE4zxyIZE0gnPP73ZJz1TjtpXE6gx4JuICTnzmg+X6l3E1rAi7R0dFBRcUu\n8vLmO+LZuJrvV8o59N5BMcIJzxzQ+/ko5Tx676AIi1aOcLTPHLCrJjDW9/NxS85V47SXxukMWhNw\nkUg/c0Dz/UqNf5oOcplIPHNA8/1KuYvWBGLMWD1zQPP9SrmT1gQiLNo5wmCfORBMTcAJ9++P9vYM\nlsZpL43TGbQm4FLhPnNA8/1KKdB0kKuF8swBzfcrNf7ovYNi1GieOaD381FK+aM1gRA4JUc40jMH\nNmxYE/V8fzCcsj1HonHaS+N0Bj0ScDl/zxzoz/cfP17NhAnFmu9XSgWkNYFxoP+ZA7m5UzXfr1QM\n0usEYpwxhvXrqzhxokfP71cqBul1AhHmtByhiLBo0exT8v1OizMQjdNeGqe93BJnqLQmME444fbS\nSin30XSQUkq5XNTSQSJyrYhsFRGPiJw9TLvLRWSHiOwSkbvDWadSSin7hFsT2AJ8EngtUAMRiQMe\nBj4GzANuEBF773wWYW7JEWqc9tI47aVxOkNYNQFjzE4AGf4E9HOA3caY/d62TwNXAzvCWbdSSqnw\n2VITEJE1wJ3GmI1+5n0a+Jgx5ive6c8B5xhjvhFgWVoTUEqpURjTeweJyMtA0eC3AAN8xxizMpj4\n/LynvbxSSjnAiIOAMeYjYa6jBpgyaLoE8H+zG69ly5ZRVlYGQHZ2NgsXLqS8vBzw5eeiOV1ZWcnt\nt9/umHgCTQ/OZTohnkDTuj11ezohnkDTTtye/a+rq6sJmzEm7C9gDbAowLx4YA8wFUgCKoE5wyzL\nON2aNWuiHUJQNE57aZz20jjt4+03Q+q/w6oJiMg1wC+AfOA4UGmMuUJEioHfGGM+4W13OfAzrLOR\nHjPGPDDMMk04MSmlVKzRewcppVQM03sHRdjgvJyTaZz20jjtpXE6gw4CSikVwzQdpJRSLqfpIKWU\nUiHRQSAEbskRapz20jjtpXE6gw4CSikVw7QmoJRSLqc1AaWUUiHRQSAEbskRapz20jjtpXE6gw4C\nSikVw7QmoJRSLqc1AaWUUiHRQSAEbskRapz20jjtpXE6gw4CSikVw7QmoJRSLqc1AaWUUiHRQSAE\nbskRapz20jjtpXE6gw4CSikVw7QmoJRSLqc1AaWUUiHRQSAEbskRapz20jjtpXE6gw4CSikVw7Qm\noJRSLqc1AaWUUiHRQSAEbskRapz20jjtpXE6gw4CSikVw7QmoJRSLqc1AaWUUiEJaxAQkWtFZKuI\neETk7GHaVYvIJhF5X0TeDWedTuCWHKHGaS+N014apzOEeySwBfgk8NoI7fqAcmPMWcaYc8JcZ9RV\nVlZGO4SgaJz20jjtpXE6Q0I4P2yM2QkgIiPlooRxlHo6fvx4tEMIisZpL43TXhqnM0SqYzbASyKy\nXkS+HKF1KqWUGsGIRwIi8jJQNPgtrE79O8aYlUGu53xjzBERKQBeFpHtxpg3Rx+uM1RXV0c7hKBo\nnPbSOO2lcTqDLaeIisga4E5jzMYg2i4HThhjfhpgvp4fqpRSoxTqKaJh1QSG8BuAiKQBccaYVhFJ\nBz4K3BdoIaH+IkoppUYv3FNErxGRg8AS4G8i8g/v+8Ui8jdvsyLgTRF5H3gHWGmMWRXOepVSStnD\ncVcMK6WUipyon7YpIjkiskpEdorISyKSFaCdR0Q2ei84+2uEYrtcRHaIyC4RudvP/CQReVpEdovI\n2yIyJRJxhRDnzSJS791+G0Xki1GI8TERqRORzcO0+bl3W1aKyMJIxjcohmHjFJGlInJ80Lb8bqRj\n9MZRIiKrRaRKRLaIyDcCtIvaNg0mRidsTxFJFpF13r5li7duObRN1D/rQcY5+s+6MSaqX8CDwLe9\nr+8GHgjQriXCccUBe4CpQCJQCcwe0uZrwCPe19cBT0dh+wUT583Az6P8d74QWAhsDjD/CuDv3tfn\nAu84NM6lwAvR3JbeOCYCC72vM4Cdfv7uUd2mQcbolO2Z5v0ej5W2PmfI/Kh/1oOMc9Sf9agfCQBX\nA497Xz8OXBOgXaQLxucAu40x+40xPcDTWLEONjj2PwOXRjC+fsHECZHfficx1inBTcM0uRp4wtt2\nHZAlIkXDtB8TQcQJUd6WAMaYI8aYSu/rVmA7MHlIs6hu0yBjBGdsz3bvy2SsE2aG5smd8FkPJk4Y\n5fZ0wiBQaIypA+ufBigI0C5ZRN4VkbUi4q+Ts9tk4OCg6RpO/QceaGOM8QDHRSQ3ArH5jcHLX5wA\nn/KmBFaISElkQhuVob9HLf5/DydY4j0k/7uIzI12MCJShnX0sm7ILMds02FiBAdsTxGJ8568cgR4\n2RizfkgTJ3zWg4kTRvlZj8ggICIvi8jmQV9bvN+vGsViphjrvkP/BPy3iEwbo3D7+RtNh466Q9uI\nnzZjLZg4XwDKjDELgVfx7dE4STC/hxO8B0w1xpwFPAxEpD4ViIhkYO2ZftO7t33SbD8/EvFtOkKM\njtiexpg+bwwlwLl+BiMnfNaDiXPUn/WIDALGmI8YYxYM+jrD+/0FoK7/EFVEJgL1AZZxxPv9A6AC\nOGuMw64BBhd/SoBDQ9ocBEoBRCQeyDTGjJRKsNuIcRpjmrypIoDfAIsiFNto1ODdll7+tnfUGWNa\n+w/JjTH/ABKjsUcIICIJWJ3rk8aY5/00ifo2HSlGJ21PbwwtWP3L5UNmOeGzPiBQnKF81p2QDnoB\nWOZ9fTNwyj+KiGSLSJL3dT5wPlA1xnGtB04XkanedV/vjXWwlVgxA3wGWD3GMfkzYpzewbXf1Yz9\ntgtECJyvfAG4CUBElgDH+9OEURAwzsE5dRE5B+s068ZIBTbEb4EqY8zPAsx3wjYdNkYnbE8RyRfv\nWYkikgpcBuwY0izqn/Vg4gzpsx6NCveQanYu8ArWmQMvA9ne9xcBj3pfnwdsBt4HNgHLIhTb5d64\ndgP3eN+7D/iE93UysMI7/x2sw7BobMOR4rwf2Ordfq8CM6MQ41NYe6FdwAHgC8CtwFcGtXkY60yn\nTcDZUdqWw8YJ/MugbbkWODdKcV4AeLDOBnsf2Oj9P3DMNg0mRidsT+AMb2yV3n7mO973HfVZDzLO\nUX/W9WIxpZSKYU5IBymllIoSHQSUUiqG6SCglFIxTAcBpZSKYToIKKVUDNNBQCmlYpgOAkopFcN0\nEFBKqRj2/wG+fq6hrJDmBAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_transformation(V_T.dot(Square), S.dot(V_T).dot(Square), \"$V^T \\cdot Square$\", \"$\\Sigma \\cdot V^T \\cdot Square$\",\n", " axis=[-0.5, 3.5 , -1.5, 1.5])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we apply the second rotation $U$:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_transformation(S.dot(V_T).dot(Square), U.dot(S).dot(V_T).dot(Square),\"$\\Sigma \\cdot V^T \\cdot Square$\", \"$U \\cdot \\Sigma \\cdot V^T \\cdot Square$\",\n", " axis=[-0.5, 3.5 , -1.5, 1.5])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can see that the result is indeed a shear mapping of the original unit square." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Eigenvectors and eigenvalues\n", "An **eigenvector** of a square matrix $M$ (also called a **characteristic vector**) is a non-zero vector that remains on the same line after transformation by the linear transformation associated with $M$. A more formal definition is any vector $v$ such that:\n", "\n", "$M \\cdot v = \\lambda \\times v$\n", "\n", "Where $\\lambda$ is a scalar value called the **eigenvalue** associated to the vector $v$.\n", "\n", "For example, any horizontal vector remains horizontal after applying the shear mapping (as you can see on the image above), so it is an eigenvector of $M$. A vertical vector ends up tilted to the right, so vertical vectors are *NOT* eigenvectors of $M$.\n", "\n", "If we look at the squeeze mapping, we find that any horizontal or vertical vector keeps its direction (although its length changes), so all horizontal and vertical vectors are eigenvectors of $F_{squeeze}$.\n", "\n", "However, rotation matrices have no eigenvectors at all (except if the rotation angle is 0° or 180°, in which case all non-zero vectors are eigenvectors).\n", "\n", "NumPy's `eig` function returns the list of unit eigenvectors and their corresponding eigenvalues for any square matrix. Let's look at the eigenvectors and eigenvalues of the squeeze mapping matrix $F_{squeeze}$:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.4 , 0.71428571])" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eigenvalues, eigenvectors = LA.eig(F_squeeze)\n", "eigenvalues # [λ0, λ1, …]" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0.],\n", " [ 0., 1.]])" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eigenvectors # [v0, v1, …]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Indeed the horizontal vectors are stretched by a factor of 1.4, and the vertical vectors are shrunk by a factor of 1/1.4=0.714…, so far so good. Let's look at the shear mapping matrix $F_{shear}$:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1., 1.])" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eigenvalues2, eigenvectors2 = LA.eig(F_shear)\n", "eigenvalues2 # [λ0, λ1, …]" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1.00000000e+00, -1.00000000e+00],\n", " [ 0.00000000e+00, 1.48029737e-16]])" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eigenvectors2 # [v0, v1, …]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wait, what!? We expected just one unit eigenvector, not two. The second vector is almost equal to $\\begin{pmatrix}-1 \\\\ 0 \\end{pmatrix}$, which is on the same line as the first vector $\\begin{pmatrix}1 \\\\ 0 \\end{pmatrix}$. This is due to floating point errors. We can safely ignore vectors that are (almost) colinear (ie. on the same line)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Trace\n", "The trace of a square matrix $M$, noted $tr(M)$ is the sum of the values on its main diagonal. For example:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "123" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = np.array([\n", " [100, 200, 300],\n", " [ 10, 20, 30],\n", " [ 1, 2, 3],\n", " ])\n", "np.trace(D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The trace does not have a simple geometric interpretation (in general), but it has a number of properties that make it useful in many areas:\n", "* $tr(A + B) = tr(A) + tr(B)$\n", "* $tr(A \\cdot B) = tr(B \\cdot A)$\n", "* $tr(A \\cdot B \\cdot \\cdots \\cdot Y \\cdot Z) = tr(Z \\cdot A \\cdot B \\cdot \\cdots \\cdot Y)$\n", "* $tr(A^T \\cdot B) = tr(A \\cdot B^T) = tr(B^T \\cdot A) = tr(B \\cdot A^T) = \\sum_{i,j}X_{i,j} \\times Y_{i,j}$\n", "* …\n", "\n", "It does, however, have a useful geometric interpretation in the case of projection matrices (such as $F_{project}$ that we discussed earlier): it corresponds to the number of dimensions after projection. For example:" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.trace(F_project)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# What next?\n", "This concludes this introduction to Linear Algebra. Although these basics cover most of what you will need to know for Machine Learning, if you wish to go deeper into this topic there are many options available: Linear Algebra [books](http://linear.axler.net/), [Khan Academy](https://www.khanacademy.org/math/linear-algebra) lessons, or just [Wikipedia](https://en.wikipedia.org/wiki/Linear_algebra) pages. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.10" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }