Skip to content

Instantly share code, notes, and snippets.

@tobydriscoll
Created August 30, 2016 21:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tobydriscoll/32708bacb1d569fc589c51571890028b to your computer and use it in GitHub Desktop.
Save tobydriscoll/32708bacb1d569fc589c51571890028b to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lecture 1. Matrix-Vector Multiplication"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matrix times vector"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A matrix right-multiplied by a column vector---that is, $\\mathbf{A}\\mathbf{x}$---is a linear combination of the columns of $\\mathbf{A}$, with coefficients of the combination given by the entries of $\\mathbf{x}$. For example,"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" -1.0\n",
" 1.0\n",
" 2.0"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = round(5*rand(3,3))\n",
"x = [-1.;1.;2.]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 2.0\n",
" 11.0\n",
" 12.0"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A*x"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 2.0\n",
" 11.0\n",
" 12.0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x[1]*A[:,1] + x[2]*A[:,2] + x[3]*A[:,3]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this context it's clear why the number of entries in $\\mathbf{x}$ has to be the same as the number of columns in $\\mathbf{A}$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you left-multiply a matrix by a vector, it should be a row vector. I'll be using column vectors exclusively, so we have to transpose (or conjugate transpose) to get the row shape. Transposition of the product also makes the interpretation clear:\n",
"\n",
"$$\n",
"\\mathbf{y}^* \\mathbf{A} = \\bigl( \\mathbf{A}^* \\mathbf{y}\\bigr)^*,\n",
"$$\n",
"\n",
"which is the (conjugate) transpose of the columns of $\\mathbf{A}^*$, i.e., the rows of $\\mathbf{A}$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Linear algebra, including abstract linear algebra, is built in large part on linear combinations. The vectors that one combines need not be ordinary vectors in $\\mathbb{C}^n$. For instance, a polynomial is a linear combination of monomials. We can encompasss this fact too by generalizing the notion of a \"matrix\":\n",
"\n",
"$$\n",
"c_0 + c_1 t + \\cdots c_n t^n = \\begin{bmatrix} 1 & t & \\cdots & t^n \\end{bmatrix} \\begin{bmatrix}c_0 \\\\ c_1 \\\\ \\vdots \\\\ c_n \\end{bmatrix}.\n",
"$$\n",
"\n",
"The \"matrix\" here is sometimes called a *quasimatrix*. From here it's a small step to imagine choosing many values of $t$ in an interval and converting the quasimatrix into a proper matrix. This is easy to carry out in MATLAB."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAq0AAAIUCAYAAAAwmRUWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XlYlXX+//EnCKKCa4riSrllmpqJ45f6JWWN2qIliDoqboBZVlJZaja5TIu2mTZZammSqWiKZqlTTliJy4ik3/qOuwiCgoqyxX7u3x9ndDI1Rc859zmc1+O6uLqu47nvz4s5TL15+74/Hw/DMAxERERERJyYp9kBRERERESuRkWriIiIiDg9Fa0iIiIi4vRUtIqIiIiI01PRKiIiIiJOT0WriIiIiDg9Fa0iIiIi4vRUtIqIiIiI01PRKiIiIiJOT0WriIiIiDi9ChetBQUFvPLKK/Tp04ebbroJT09PlixZcs3X5+TkEB0djb+/P35+ftx3330kJydXNIaIiIiIuJEKF62nT59mxowZ7Nu3j86dO+Ph4XHN1xqGwYMPPsjy5ct5+umnefPNNzl16hQhISEcPny4olFERERExE14VfSCxo0bc/LkSfz9/UlKSiIoKOiar125ciXbtm3jiy++4LHHHgNgwIABtGnThldeeYXPPvusonFERERExA1UuNPq7e2Nv7//dS32xRdf0KhRowsFK0D9+vUJDw9n7dq1lJaWXtd9RURERKRyc+iDWMnJyXTp0uWS17t168avv/7KgQMHHBlHRERERFyEQ4vWEydOEBAQcMnr51/LyMhwZBwRERERcREVnmm9EYWFhfj4+FzyerVq1TAMg8LCwsted/r0aTZt2kRgYCDVq1e3d0wRERERqaDCwkJSUlLo1asX9evXt/n9HVq0Vq9eneLi4kteLyoqwsPD44oF6aZNmxg6dKi944mIiIjIDfrss88YMmSIze/r0KI1ICCAEydOXPL6+dcaN2582esCAwMBmDHjM26+uZ3d8onzePvtGJ577l2zY4iD6PN2L/q83Ys+78rO4Ku0JRQmrCK+60h49dULdZutObRo7dy5Mz/++OMlr2/fvp0aNWrQpk2by153vgP74IPtLvsgl1Q+K1bUZsgQfdbuQp+3e9Hn7V70eVdeOUU5jFg7gv9Lj+euThNo0LAhp8Buo5x2exDr5MmT7N+/n/Ly8guvhYWFkZmZyerVqy+8dvr0aVatWkXfvn3x9va2VxwRERERsZG9mXvpuqArCYf/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",
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x31d6b3510>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"4-element Array{Any,1}:\n",
" PyObject <matplotlib.lines.Line2D object at 0x31d722150>\n",
" PyObject <matplotlib.lines.Line2D object at 0x31d722350>\n",
" PyObject <matplotlib.lines.Line2D object at 0x31d722490>\n",
" PyObject <matplotlib.lines.Line2D object at 0x31d7225d0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t = linspace(0,1,51); \n",
"V = zeros(length(t),4);\n",
"for j = 0:3\n",
" V[:,j+1] = t.^j; \n",
"end\n",
"using PyPlot\n",
"plot(t,V)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matrix times matrix"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's often useful to think of a matrix--matrix product as a collection of matrix--vector products. For example,"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"4x3 Array{Float64,2}:\n",
" 4.0 7.0 9.0\n",
" 3.0 4.0 5.0\n",
" 5.0 9.0 13.0\n",
" 8.0 11.0 18.0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = round(8*rand(4,4)); B = triu(ones(4,3)); \n",
"C = A*B"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"4x3 Array{Float64,2}:\n",
" 4.0 7.0 9.0\n",
" 3.0 4.0 5.0\n",
" 5.0 9.0 13.0\n",
" 8.0 11.0 18.0"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[ A*B[:,1] A*B[:,2] A*B[:,3] ]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hence the number of rows in $\\mathbf{B}$ has to be the same as the number of columns in $\\mathbf{A}$. In the special case where that number is 1, then $\\mathbf{A}$ is a column vector and $\\mathbf{B}$ is a row vector, and the result is called a **vector outer product**. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((3,),(1,3))"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u = [ 1; 2; 3 ]; v = [ 1im -1im 1 ];\n",
"size(u), size(v)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3x3 Array{Complex{Int64},2}:\n",
" 0+1im 0-1im 1+0im\n",
" 0+2im 0-2im 2+0im\n",
" 0+3im 0-3im 3+0im"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u*v"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Rank and inverse"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The rank and inverse of a matrix are of critical importance in linear algebra. It's important to be aware, however, that they are not robust to perturbations. For example, it should be clear that this matrix is singular and of rank 1."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = [ 0 1; 0 0 ]\n",
"rank(A)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, any perturbation of the second row, no matter how small, mathematically changes the rank to 2 and thus makes the matrix invertible."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"B = A + [0 0; 1e-12 0 ]\n",
"rank(B)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In numerical computation, representation of and arithmetic with real numbers cannot be exact. Therefore, the notions of rank and invertibility will have to be carefully reconsidered. In fact, it's questionable as to whether you should ever compute a matrix rank in finite precision. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Change of basis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In linear algebra one learns that a matrix is the expression of a linear transformation relative to a particular basis. Unless stated otherwise, when we write out the numerical values of a matrix, we have chosen the standard basis, whose elements are the columns of an identity matrix. \n",
"\n",
"Say we have a basis whose elements, when expressed in the standard basis, are the columns of a square matrix $\\mathbf{A}$. Let a vector $\\mathbf{v}$ be given as coordinates $x_1,x_2,\\ldots$ in that basis. Then we can convert the coordinates of $\\mathbf{v}$ to standard by matrix--vector multiplication:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 18.0\n",
" 9.0\n",
" 17.0"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = round(10*rand(3,3)); x = [ -1; 1; 2 ];\n",
"v_standard = A*x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Consequently, we can convert a vector from standard coordinates to the \"$\\mathbf{A}$-basis\" through multiplication by $\\mathbf{A}^{-1}$. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" -1.0\n",
" 1.0\n",
" 2.0"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v_Abasis = A^(-1) * v_standard"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that while `A^(-1)*` works, *it is not recommended*, for reasons we will go into later. A mathematically equivalent but computationally preferable syntax is to use `A\\` instead."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" -1.0\n",
" 1.0\n",
" 2.0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v_Abasis = A \\ v_standard"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 0.4.3",
"language": "julia",
"name": "julia-0.4"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "0.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment