{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Solution to Assignment 2\n", "\n", "**MATH7502 2019, Semester 2**\n", "\n", "[Assignment 2 questions](https://courses.smp.uq.edu.au/MATH7502/2019/ass2.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have,\n", "$$\n", "x = \\sum_{i=1}^k \\beta_i a_i\n", "$$\n", "\n", "with $a_i$ orthonomral vectors.\n", "\n", "$$\n", "||x||^2 = ||\\beta_1 a_1 + \\ldots \\beta_k a_k ||^2 = (\\beta_1 a_1 + \\ldots \\beta_k a_k)^T(\\beta_1 a_1 + \\ldots \\beta_k a_k) = \\beta_1^2 + \\ldots + \\beta_k^2 = ||\\beta||^2.\n", "$$\n", "\n", "Hence $||x|| = ||\\beta||$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have\n", "$$\n", "a_1 = \\left[\\begin{matrix}\n", "1 \\\\ 0 \\\\ 0 \\\\ \\vdots \\\\ 0 \\\\\n", "\\end{matrix}\\right],\n", "\\qquad\n", "a_2 = \\left[\\begin{matrix}\n", "1 \\\\ 1 \\\\ 0 \\\\ \\vdots \\\\ 0 \\\\\n", "\\end{matrix}\\right],\n", "\\qquad\n", "\\ldots\n", "\\qquad\n", "a_n = \\left[\\begin{matrix}\n", "1 \\\\ 1 \\\\ 1 \\\\ \\vdots \\\\ 1 \\\\\n", "\\end{matrix}\\right],\n", "$$\n", "\n", "(a) Running Gram-Schmidt\n", "\n", "$$\n", "q_1 = \\tilde{q}_1 = a_1 = e_1\n", "$$\n", "\n", "$$\n", "q_2 = \\tilde{q}_2 = a_2 - (q_1^T a_2) q_1 = e_2\n", "$$\n", "\n", "$$\n", "q_3 = \\tilde{q}_3 = a_3 - (q_1^T a_3) q_1 - (q_2^T a_3) q_2 = e_3\n", "$$\n", "\n", "$$\n", "\\vdots\n", "$$\n", "\n", "$$\n", "q_n = e_n\n", "$$\n", "\n", "(b) Yes, $a_1,\\ldots,a_n$ is a basis for $\\mathbb{R}^n$. Because G-S didn't terminate, we found that the vectors are linearly independent and there are $n$ of them." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(c) A G-S implementation" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "gs (generic function with 1 method)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using LinearAlgebra\n", "\n", "function gs(a)\n", " k, n = length(a), length(a[1])\n", " q = fill(zeros(n),k) #an array of vectors\n", " q[1] = a[1]/norm(a[1])\n", " for i in 2:k\n", " qT = a[i]-sum([(q[j]'*a[i])*q[j] for j in 1:i-1])\n", " if norm(qT) < 10^-8\n", " println(\"Dependent vectors after $(i) iterations\")\n", " return\n", " end\n", " q[i] = qT/norm(qT)\n", " end\n", " q\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test it on some basic inputs... " ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Array{Float64,1},1}:\n", " [0.707107, 0.707107] \n", " [0.707107, -0.707107]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = gs([[1,1],[1,0]])" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Float64,1}:\n", " 0.9999999999999999\n", " 1.0 " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "norm.(q)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.7755575615628914e-16" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q[1]'*q[2]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15-element Array{Float64,1}:\n", " 0.9999999999999999\n", " 1.0 \n", " 0.9999999999999999\n", " 0.9999999999999999\n", " 1.0 \n", " 1.0 \n", " 0.9999999999999999\n", " 0.9999999999999999\n", " 1.0000000000000002\n", " 0.9999999999999999\n", " 0.9999999999999999\n", " 1.0 \n", " 0.9999999999999999\n", " 0.9999999999999999\n", " 1.0 " ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = gs([rand(20) for _ in 1:15]);\n", "norm.(q)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15×15 Array{Float64,2}:\n", " 1.0 1.17229e-16 2.87541e-16 … 6.12258e-16 1.80411e-16\n", " 1.17229e-16 1.0 -2.5431e-16 -2.95635e-16 5.96745e-16\n", " 2.87541e-16 -2.5431e-16 1.0 -1.47594e-16 -6.245e-17 \n", " 7.13624e-17 -1.03405e-16 -6.06927e-17 -3.29407e-16 4.44089e-16\n", " -2.91614e-16 -3.53699e-16 -3.64357e-16 -4.12128e-16 -4.78784e-15\n", " -1.5689e-17 -1.24718e-16 4.85177e-17 … 9.88694e-16 1.72085e-15\n", " 2.70461e-17 2.09903e-16 1.70043e-16 2.62886e-16 4.23273e-15\n", " -9.19821e-17 4.30837e-16 -1.07332e-16 1.43942e-15 5.02376e-15\n", " 4.29366e-16 2.1304e-16 -1.17614e-16 -2.53108e-16 9.85323e-16\n", " -7.24987e-16 -3.84805e-16 -6.40421e-16 2.18725e-15 -4.996e-15 \n", " -3.70411e-16 -5.16291e-17 -7.1818e-16 … 1.94999e-15 5.7454e-15 \n", " 1.0265e-15 -2.7893e-16 -1.1588e-16 -2.57221e-15 -2.13718e-15\n", " 6.16813e-17 -8.80087e-17 2.64214e-16 -9.35483e-16 -9.58627e-16\n", " 6.12258e-16 -2.95635e-16 -1.47594e-16 1.0 -1.17938e-14\n", " 1.80411e-16 5.96745e-16 -6.245e-17 -1.17938e-14 1.0 " ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Q = hcat(q...)\n", "Q'*Q" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dependent vectors after 21 iterations\n" ] } ], "source": [ "q = gs([rand(20) for _ in 1:30]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Now for the question" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10-element Array{Array{Float64,1},1}:\n", " [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a(k,n) = [ones(k) ; zeros(n-k)]\n", "\n", "n = 10\n", "vecs = [a(k,n) for k in 1:n]\n", "gs(vecs)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100-element Array{Array{Float64,1},1}:\n", " [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " ⋮ \n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]\n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 100\n", "vecs = [a(k,n) for k in 1:n]\n", "gs(vecs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Now shuffle the order" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10-element Array{Array{Float64,1},1}:\n", " [0.353553, 0.353553, 0.353553, 0.353553, 0.353553, 0.353553, 0.353553, 0.353553, 0.0, 0.0] \n", " [0.612372, 0.612372, -0.204124, -0.204124, -0.204124, -0.204124, -0.204124, -0.204124, 0.0, 0.0] \n", " [0.0, 0.0, 0.408248, 0.408248, 0.408248, -0.408248, -0.408248, -0.408248, 0.0, 0.0] \n", " [0.0, 0.0, 0.408248, 0.408248, -0.816497, 1.35974e-16, 1.35974e-16, 1.35974e-16, 0.0, 0.0] \n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.408248, 0.408248, -0.816497, 0.0, 0.0] \n", " [0.0, 0.0, 1.11022e-16, 1.11022e-16, 2.22045e-16, -2.22045e-16, -2.22045e-16, 1.9984e-15, 1.0, 0.0] \n", " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.9984e-15, 1.0] \n", " [0.0, 0.0, 1.57009e-16, 1.57009e-16, -3.14018e-16, 0.707107, -0.707107, 7.85046e-16, -3.14018e-16, 0.0] \n", " [0.0, 0.0, 0.707107, -0.707107, -7.85046e-17, -1.57009e-16, 1.57009e-16, -4.61935e-31, -1.57009e-16, 0.0] \n", " [0.707107, -0.707107, 3.92523e-17, 3.92523e-17, 3.92523e-17, 3.92523e-17, 3.92523e-17, 3.92523e-17, 0.0, 0.0]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Random\n", "Random.seed!(0)\n", "n = 10\n", "vecs = shuffle([a(k,n) for k in 1:n])\n", "gs(vecs)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10-element Array{Float64,1}:\n", " 1.0\n", " 1.0\n", " 1.0\n", " 1.0\n", " 1.0\n", " 1.0\n", " 1.0\n", " 1.0\n", " 0.0\n", " 0.0" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vecs[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As appears, a different order of input yields a different set of vectors. Here for example, the first vector was $e_8$ and thus it was normalized... The rest of the results were very different" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$A$ and $B$ are matrices of the same dimension.\n", "\n", "(a) If $Ax = Bx$ holds for all vectors $x$ then $A = B$. This is because we can use $x=e_i$ for all $i$ and this shows that the $i$'th collumn of $A$ is the same as that of $B$.\n", "\n", "(b) If $Ax = Bx$ for some non zero vector it doesn't imply that $A = B$. Take for example $x= [1 ~~ 1]^T$ with,\n", "\n", "$$\n", "A = [1~~0],\\qquad B = [0~~1].\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$ A \\in \\mathbb{R}^{m \\times n}$. We want to show that $A$ has the same null-space as $A^T A$ (a matrix in ${\\mathbb R}^{n \\times n}$). Define, the null-spaces of $A$ and $A^T A$ resperespectivelyctivily, \n", "\n", "$$\n", "{\\cal N}_1 = \\{x \\in \\mathbb{R}^n~|~ Ax = 0_m\\}\n", "\\qquad\n", "{\\cal N}_2 = \\{x \\in \\mathbb{R}^n ~|~ A^TAx = 0_n\\}.\n", "$$\n", "\n", "Take $x \\in {\\cal N_1}$. Then $A x = 0_m$. Left multiply by $A^T$ then $A^T A x = 0_n$. Hence $x \\in {\\cal N_2}$. Hence ${\\cal N}_1 \\subset {\\cal N}_2$.\n", "\n", "Take now $x \\in {\\cal N_2}$. Then $A^T A x = 0_n$. Left multiply by $x^T$:\n", "$$\n", "x^T A^T A x = 0\n", "$$\n", "or\n", "$$\n", "(A x)^T A x = 0\n", "$$\n", "Hence $||Ax||^2 = 0$ and $||A x|| = 0$. Hence $Ax$ must be the zero vector, that is $Ax = 0_m$. Hence $x \\in {\\cal N}_1$. Hence ${\\cal N}_2 \\subset {\\cal N}_1$.\n", "\n", "Since ${\\cal N}_1 \\subset {\\cal N}_2$ and ${\\cal N}_2 \\subset {\\cal N}_1$, we have that $N_1 = N_2$.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$A^T = - A$\n", "\n", "(a) For a $2 \\times 2$ matrix:\n", "$$\n", "A = \\left[\\begin{matrix}\n", "a & b\\\\\n", "c & d \n", "\\end{matrix}\\right].\n", "$$\n", "\n", "We have $a=-a$, $d=-d$ and $b = -c$. This implies that $a$ and $d$ must be zero and there is a single number $\\alpha$ with \n", "\n", "$$\n", "A = \\left[\\begin{matrix}\n", "0 & \\alpha\\\\\n", "-\\alpha & 0 \n", "\\end{matrix}\\right].\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(b) In general we must have that $A_{ii} = -A_{ii}$ hence $A_{ii} = 0$ (diagonal elements are $0$)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(c) Assume $A^T = -A$: \n", "\n", "$$\n", "(Ax)^T x = x^T A^T x = - (x^T A x) = -((Ax)^T x) \n", "$$ \n", "Hence the inner product must be $0$ and $Ax$ is orthogonal to $x$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(d) Now assume $(Ax)^T x = 0$ for any vector $x$. That is $x^T A^T x = 0$. Hence,\n", "\n", "$$\n", "x^T A^T x = 0,\n", "$$ \n", "or taking transpose of the scalar,\n", "$$\n", "x^T A x = 0.\n", "$$\n", "That is,\n", "$$\n", "\\sum_{k=1}^n \\sum_{\\ell=1}^n x_k x_\\ell A_{k \\ell} = 0.\n", "$$\n", "\n", "If we set $x = e_i$ for some $i$ we get that $A_{i i} = 0$.\n", "\n", "Now if we set $x = e_i + e_j$ for $i \\neq j$ then \n", "$$\n", "(e_i + e_j)^T A (e_i + e_j) = e_i^T A e_i + e_i^TAe_j + e_j^T Ae_i + e_j^TAe_j = 0\n", "$$\n", "or,\n", "$$\n", "A_{ii} + A_{ij} + A_{ji} + A_{jj} = 0.\n", "$$\n", "Since we already showed that $A_{ii}$ and $A_{jj}$ are 0 we get $A_{ij} = - A_{ji}$ and hence $A = - A^T$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(e) Take any square matrix $\\tilde{A}$ and look at $A = \\tilde{A} - \\tilde{A}^T$. Observe that it is skew-symmetric since $A^T = -A$" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-5.551115123125783e-16, 6.661338147750939e-16)" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function randSkewSym(n)\n", " A = rand(n,n)\n", " A-A'\n", "end\n", "\n", "innerProds = []\n", "\n", "for _ in 1:10^5\n", " A = randSkewSym(5)\n", " x = rand(5)\n", " push!(innerProds,dot(A*x,x))\n", "end\n", "minimum(innerProds),maximum(innerProds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see above that all inner products were \"0\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 6\n", "Note: Important in this question to find the **matrix of the linear transformation**" ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 173, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Plots\n", "pyplot()\n", "N = 10\n", "image = [(i+j)^2 for i in 1:N, j in 1:N]\n", "heatmap(image,yflip = true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Functions from changing image to vector and back" ] }, { "cell_type": "code", "execution_count": 174, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img2Vec(img) = vcat([img[:,j] for j in 1:N]...)\n", "vec2Img(vec) = reshape(vec,N,N)\n", "heatmap(vec2Img(img2Vec(image)),yflip = true) #test" ] }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ee (generic function with 1 method)" ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#The key to solving the problem is to work with identity vectors\n", "ee(i) = [j ==i ? 1 : 0 for j in 1:N^2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(a) Turning the orignial image upside down." ] }, { "cell_type": "code", "execution_count": 176, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#This is the function for flipping the image (without thinking about matrix multiplication)\n", "flipImageUpDown(img) = [img[i,j] for j in N:-1:1, i in 1:N] \n", "\n", "#testIt\n", "heatmap(\n", " flipImageUpDown(image),\n", " yflip = true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### HOWEVER: The above isn't what we asked for. We wanted the **MATRIX** that does it... Here it is:\n", "\n", "We get it by assuming the transformation is linear and applying it to the vectors $e_1,\\ldots,e_{N^2}$...." ] }, { "cell_type": "code", "execution_count": 177, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100×100 Array{Int64,2}:\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 1 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 1 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ \n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 1\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" ] }, "execution_count": 177, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Aflip = hcat([img2Vec(flipImageUpDown(vec2Img(ee(i)))) for i in 1:N^2]...)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Testing it:" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 178, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heatmap(\n", " vec2Img(\n", " Aflip*img2Vec(image)\n", " ),\n", " yflip = true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(a) Rotate the original image clockwise 90 degrees" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#This is the function for it (without thinking about matrix multiplication)\n", "\n", "rotateClockWise90(img) = [img[i,j] for j in 1:N, i in N:-1:1] \n", "\n", "#testIt\n", "heatmap(\n", " rotateClockWise90(image),\n", " yflip = true)" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100×100 Array{Int64,2}:\n", " 0 0 0 0 0 0 0 0 0 1 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1\n", " 0 0 0 0 0 0 0 0 1 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ \n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0\n", " 1 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0" ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We can do: (this is just like before only with the rotateClockWise90 function...)\n", "#Arotate = hcat([img2Vec(rotateClockWise90(vec2Img(ee(i)))) for i in 1:N^2]...)\n", "\n", "#instead lates make a function that gives us the linear transformation of a function...\n", "\n", "makeA(trans) = hcat([img2Vec(trans(vec2Img(ee(i)))) for i in 1:N^2]...)\n", "\n", "#Now\n", "Arotate = makeA(rotateClockWise90)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Testing it:" ] }, { "cell_type": "code", "execution_count": 181, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAYAAAByNR6YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3df2xUVf7/8dethekWHPr9Fop222HaLC1RVttVkKAQzRpBFhPXYkSptoGkNYvxa8LKsvuHPxJsNWtcv0T42E02WGzCV0Jx2ZgoCutqSKrijsVFFijQoTNhsYoL3UUptPd8/yiMrbTAXO5w7wzPBzmRuXfOzJso8Pb9PudcyxhjBAAAANdkeR0AAABApiHBAgAAcFnKEqxvv/1WkUhE3377baq+AgAAwJeyU/XBe/bs0U033aSq/7VQE0YVpOprLqujvZm1XK379EmvQ3DV19Zxr0Nw3XHra69DcNV/+zPr19Pbf8zrEFx3qv8/XofgKmNn1p9ztjntdQiuMz78NT377LN65pln9I9//ENTp05VR0eHampq9PXXXysvL0+vvfaarrvuOkka8R4tQgAAgDMikYg++ugjhUKhxLX6+nrV1dVp3759Wr58uZYsWXLBeyRYAAAAknp7e7V06VKtWbNGlmVJkrq7uxWJRFRdXS1JqqqqUmdnp6LR6HnvpaxFCAAAcKlOnjypU6dOOZ5vjEkkS2cFAgEFAoFz3vvUU0+purpaJSUliWuxWEyFhYXKzh5ImSzLUigUUldXl8aMGTPiPRIsAADgSydPnlRJyTU6csT5GtuxY8fqv//975BrTz/9tJ555pkh19ra2rRjxw49//zz53zGDxO0wUeIjnSPBAsAAPjSqVOndOTIcUVj/1fB4I+Snt/T853Cxf9HsVhMwWAwcX246tUHH3ygPXv2JKpX8Xhcc+bMUUNDg+LxuPr6+pSdnS1jjGKxmEKhkHJzc0e8xxosAADga1ePHe14SFIwGBwyhkuwVqxYocOHDysajSoajaqoqEhbtmxRTU2NKisr1dLSIklqbW1VOBxWOBxWQUHBiPeoYAEAAF8zpl/G9Dua54ampibV1taqoaFBwWBQzc3NF7xHggUAAPAD0Wg08fPy8nK1tbUN+76R7pFgAQAAXzOmT8b0OZrnFRIsAADga+mYYLHIHQAAwGVUsAAAgK/Zdr9sO/lqlG27s8jdCRIsAADga7QIAQAAQAULAAD4WzpWsEiwAACAr6VjgkWLEAAAwGVUsAAAgK8Zu0/GwS5CJ3PcQoIFAAD8ze6XnCRLHh7TQIsQAADAZVSwAACAv5nTknFQEzKn3Y/lIpFgAQAAf7P7JPsqZ/M8QosQAADAZVSwAACAvxmHFSwOGgUAABiB6XeWLBl2EQIAAGQMKlgAAMDf7D7JdlAT4qBRAACA4Vl2nywHCZbFLkIAAIDMQQULAAD4m+lzeNAoLUIAAIDhpeEaLFqEAAAALqOCBQAA/M22JdvBmVa27X4sF4kECwAA+Jpl9zvcRchBowAAABmDChYAAPA30+9wF6F3FayUJ1jjA7auDXjXA3VXphX8crwOwF2nvQ4AF+TgWa3ApTjldQAuy8qUv06TRIsQAAAAtAgBAIDP2f0Oz8HK4BYhAADAJTEOEywP12DRIgQAAHAZFSwAAOBrlrFlOahGWYaDRgEAAIZn90u25WyeR2gRAgAAuIwKFgAA8LWBc7CSr2B5eQ4WCRYAAPA3WoQAAAAgwQIAAP5m9zsfSbjrrrt0ww03qKKiQrNmzVJ7e7skKRwOa8qUKaqoqFBFRYXeeOONxJyOjg7NnDlTZWVlmj59unbv3i2JFiEAAPA5y7Zl2ckfuZDsnA0bNigvL0+S9Oc//1mLFy9WJBKRJG3cuFFTp049Z059fb3q6upUW1urjRs3asmSJWpra6OCBQAAICmRXEnS8ePHlZV1/jSpu7tbkUhE1dXVkqSqqip1dnYqGo1SwQIAAD5n284WrJ+pYPX09Ay5HAgEFAgEhp3yyCOP6P3335ckvfPOO4nrixYtkm3buuWWW9TY2KgJEyYoFoupsLBQ2dkD6ZRlWQqFQurq6qKCBQAA/G3gmAZnQ5KKi4s1bty4xGhsbBzxu9atW6dYLKaVK1fqySeflCR9+OGH2rlzpyKRiPLz81VTU/N9bNbQ3Y3GGEkO1mCdPHlSCxcu1O7du5Wbm6trrrlGr776qsLhcLIfBQAAkHKxWEzBYDDxeqTq1WA1NTV69NFHdfToUYVCIUnSqFGj9MQTT6isrEzSQOIWj8fV19en7OxsGWMUi8UUCoWcVbDq6uq0d+9etbe3a/78+aqrq3PyMQAAABdmHO4gPPP8wmAwOGQMl2D19PTo8OHDiddvvvmm8vPzlZOTo2PHjiWur1+/XpWVlZKkgoICVVZWqqWlRZLU2tqqcDiscDicfAUrJydH8+bNS7yeMWOGXn755WQ/BgAA4OLYtsODRi9+F+Hx48dVVVWl7777TllZWZowYYLeeustffnll6qqqlJ/f7+MMSotLdW6desS85qamlRbW6uGhgYFg0E1NzdLcuGYhlWrVumee+651I8BAADwTHFxsT755JNh73322WcjzisvL1dbW9s51y8pwWpoaFBHR4deffXVS/kYAACAEQ0sWHc2zyuOE6wXX3xRmzZt0tatW5Wbm+tmTAAAAN+7DC1CtzlKsF566SWtX79eW7duHXIoFwAAABwkWPF4XMuWLVNpaanuuOMOSQPbHT/++GPXgwMAABjYFehwnkeSTrCKiooSh2gBAACknG2ctfts7/IVTnIHAABwGc8iBAAAvmbZtsNdhGm2yB0AAOCysfudtfs8TLBoEQIAALiMChYAAPA323a4i5AWIQAAwPCMwwTL0CIEAADIGFSwAACAr7GLEAAAwG3sIgQAAAAVLAAA4G+2cVjB8u5ROSRYAADA39LwmAZahAAAAC5LeQVrfM5pXZvTm+qvuUwCXgfgskzLr3O8DsB9p70OAOd1ldcB4EpzyusAvGIbZ9UoWoQAAAAjsI3DFqF3CVamlTAAAAA8RwULAAD4m21LtuVgHi1CAACA4aVhgkWLEAAAwGVUsAAAgL+l4SJ3EiwAAOBvxmGL0NAiBAAAyBhUsAAAgL/RIgQAAHCXsQeGk3leoUUIAADgMipYAADA38yZ4WSeR0iwAACAv9lyuAbL7UAuHi1CAAAAl1HBAgAA/paGFSwSLAAA4G9pmGDRIgQAAHAZFSwAAOBr6XgOFgkWAADwN1qEAAAAoIIFAAD8zchZNcrDg0apYAEAAH+zL2Ek4a677tINN9ygiooKzZo1S+3t7ZKkjo4OzZw5U2VlZZo+fbp2796dmDPSPRIsAAAASRs2bNDnn3+u9vZ2LVu2TIsXL5Yk1dfXq66uTvv27dPy5cu1ZMmSxJyR7pFgAQAAXzMmy/FIRl5eXuLnx48fV1ZWlrq7uxWJRFRdXS1JqqqqUmdnp6LR6HnvsQYLAAD4m20NjKTnDfyjp6dnyOVAIKBAIDDslEceeUTvv/++JOmdd95RLBZTYWGhsrMHUibLshQKhdTV1aUxY8aMeI8KFgAAyGjFxcUaN25cYjQ2No743nXr1ikWi2nlypV68sknJQ0kToMZ8/3q+ZHuUcECAAD+dokVrFgspmAwmLg8UvVqsJqaGj366KMqKipSPB5XX1+fsrOzZYxRLBZTKBRSbm7uiPeoYAEAAF8zxnI8JCkYDA4ZwyVYPT09Onz4cOL1m2++qfz8fBUUFKiyslItLS2SpNbWVoXDYYXD4fPeo4IFAACueMePH1dVVZW+++47ZWVlacKECXrrrbdkWZaamppUW1urhoYGBYNBNTc3J+aNdI8ECwAA+NsltggvRnFxsT755JNh75WXl6utrS2peyRYAADA34w1MJKe534oF4s1WAAAAC6jggUAAHzN2JaMgxahcfL8QpeQYAEAAH+7DGuw3EaLEAAAwGVUsAAAgK8NPtMquXkpCOYikWABAAB/M5ZkO2i6ebgIK+UJ1sQfnVDRmAsfSQ8vZNq/l0zseOd4HYC7TnsdAC7oKq8DADIDFSwAAOBrzncROlgY7xISLAAA4G+OdxF6l2BlYk8FAADAU1SwAACArxmTJWOSrwmxixAAAGAE6bgGixYhAACAy6hgAQAAf7OznJ2DxbMIAQAAhuf8JHdahAAAABmDChYAAPC3NDwHiwQLAAD4mrGzZByswfLwUYS0CAEAANxGBQsAAPhaOi5yJ8ECAAC+dkUdNPrss8/Ksizt2rXLzXgAAADSnqMKViQS0UcffaRQKOR2PAAAAEMY47CClU7nYPX29mrp0qVas2aNLMu7wAEAwBXCZDkfHkn6m5966ilVV1erpKQkFfEAAACkvaRahG1tbdqxY4eef/75VMUDAAAwhLGdLVhPm3OwPvjgA+3Zs0clJSUKh8OKx+OaM2eO3n777VTFBwAArnRndhEmO7w8yT2pBGvFihU6fPiwotGootGoioqKtGXLFt19992pig8AACDtcA4WAADwNWOyZBwsWDfGpCCai3NJCVY0GnUpDAAAgBGk4cOeeRYhAACAy2gRAgAAX+NZhAAAAC67op5FCAAAgOFRwQIAAL52xe0iBAAASDVahAAAAKCCBQAA/C0ddxFSwQIAAL5mjLNnESaTYJ08eVL33nuvysrKVFFRoblz5yYOVL/99ttVWlqqiooKVVRU6A9/+ENiXnd3t+bOnavJkydr6tSp2r59uyQqWAAAAJKkuro63X333bIsS6+88orq6ur07rvvSpJWrVql+fPnnzNnxYoVmjFjht555x3t2LFDCxYs0IEDB0iwAACAv12OXYQ5OTmaN29e4vWMGTP08ssvX3Dehg0b1NnZKUmaNm2aJk6cqO3bt9MiBAAA/uaoPTho52FPT8+Q0dvbe8HvXLVqle65557E6yeffFI//elP9cADD+jgwYOSpKNHj8q2bU2YMCHxvnA4rK6uLhIsAACQ2YqLizVu3LjEaGxsPO/7Gxoa1NHRoeeee06S9Prrr+uf//ynPv/8c82aNWtIq9Cyhq7zOls1S3mLcPzVPbo2mOpvASQp4HUAKZBp/w+U43UA7jrtdQC4oKu8DgBuuNRdhLFYTMHg98lIIDDy3xcvvviiNm3apK1btyo3N1fSQIImDSRTjz32mH7961/r6NGjys/PlyR99dVXiSrWoUOHFAqFMu5PbwAAkGHOJlhOhiQFg8EhY6QE66WXXtL69ev13nvvKS8vT5LU19enL7/8MvGe1tZWTZw4MZFc3X///Vq9erUkaceOHTpy5Ihuu+02FrkDAADE43EtW7ZMpaWluuOOOyQNVLr++te/6he/+IV6e3uVlZWl8ePH6y9/+Uti3gsvvKCHH35YkydP1ujRo/X6668rOzubBAsAAPibbVuyHTz2Jpk5RUVFI+46/PTTT0ecN3HixMRRDoORYAEAAF8baPc5OabBTkE0F4c1WAAAAC6jggUAAHwtHZ9FSIIFAAB8bfChocnO8wotQgAAAJdRwQIAAL5GixAAAMBtDhMseZhg0SIEAABwGRUsAADga8ZkOTwHy7s6EgkWAADwtctxkrvbaBECAAC4jAoWAADwNXYRAgAAuCwdEyxahAAAAC6jggUAAHzNyGEFS7QIAQAAhkWLEAAAAFSwAACAv6VjBYsECwAA+JptLNkOkiUnc9xCixAAAMBlVLAAAICv0SIEAABwWTomWLQIAQAAXEYFCwAA+Fo6VrBIsAAAgK/ZxtmOQNukIJiLRIsQAADAZVSwAACAr9EiBAAAcFk6Jli0CAEAAFxGBQsAAPiacfioHFqEAAAAI6BFCAAAACpYAADA32yHLUInc9xCggUAAHwtHVuEKU+w/vf4o5qY/12qvwbIUAGvA3BZpq1KyPE6APed9joAnNdVXgeAi0UFCwAA+JqRJSMHFSwHc9xCggUAAHwtHddgZVq9HgAAwHNUsAAAgK+xyB0AAMBltAgBAADS0MmTJ3XvvfeqrKxMFRUVmjt3rqLRqCSpu7tbc+fO1eTJkzV16lRt3749MW+keyRYAADA1862CJ2MZNTV1Wnv3r1qb2/X/PnzVVdXJ0lasWKFZsyYoY6ODq1du1aLFi1SX1/fee/RIgQAAL5my2GLMIljGnJycjRv3rzE6xkzZujll1+WJG3YsEGdnZ2SpGnTpmnixInavn27br/99hHvkWABAICM1tPTM+R1IBBQIHD+g5xXrVqle+65R0ePHpVt25owYULiXjgcVldX13nv0SIEAAC+dvagUSdDkoqLizVu3LjEaGxsPO/3NTQ0qKOjQ88995wkybKGVsKMMYmfj3SPChYAAMhosVhMwWAw8fp81asXX3xRmzZt0tatW5Wbm6vc3FxJ0ldffZWoVB06dEihUEj5+fkj3qOCBQAAfO3sMQ1OhiQFg8EhY6QE66WXXtL69ev13nvvKS8vL3H9/vvv1+rVqyVJO3bs0JEjR3Tbbbed9x4VLAAA4G8ODxpVEnPi8biWLVum0tJS3XHHHZIGKl0ff/yxXnjhBT388MOaPHmyRo8erddff13Z2QMp1Ej3SLAAAMAVr6ioaMjaqsEmTpyod999N6l7jlqEvb29euyxxzR58mRdf/31qq6udvIxAAAAF3SpLUIvOKpgrVixQllZWdq3b58sy9K//vUvt+MCAACQlJ6Pykk6wTpx4oTWrl2reDye2Jp47bXXuh4YAABAukq6RXjgwAHl5+dr5cqVuvnmmzVr1ixt27YtFbEBAADIXMLwStIJ1unTp3Xw4EFdd911+vTTT/XKK69o4cKF+uqrr1IRHwAAuMKl4xqspBOsSZMmKSsrS4sWLZIk3XjjjSopKdEXX3zhenAAAADpKOkEa/z48fr5z3+uLVu2SBo4sbSzs1Pl5eWuBwcAAGCMZM6chZXc8C5mR7sIX331VS1evFi/+c1vdNVVV+mPf/wjC90BAEBK2LJky8EuQgdz3OIowSotLdXf/vY3l0MBAADIDJzkDgAAfO1sy8/JPK+QYAEAAF+zzcBwMs8rjh6VAwAAgJFRwQIAAL52RTwqBwAA4HIysmQc7Ah0MscttAgBAABcRgULAAD4Gi1CAACAFPDywc1O0CIEAABwGRUsAADgaxw0CgAA4DL7zHAyzyu0CAEAAFxGBQsAAPgaLUIAAACXpeOzCFOeYF1d/KXyCsnjAEhSwOsAXJaJqyxyvA7AXae9DgBXKjIfAADga+n4qBwSLAAA4GvpeJJ7Jta3AQAAPEUFCwAA+JqRs0flePl4HRIsAADga7QIAQAAQAULAAD4Gy1CAAAAl9EiBAAAABUsAADgbzwqBwAAwHXOTnKXhye50yIEAABwGRUsAADga7Yctghdj+TikWABAABfS8eHPdMiBAAAcBkJFgAA8LWzuwidjGQ8/vjjCofDsixLu3btSlwPh8OaMmWKKioqVFFRoTfeeCNxr6OjQzNnzlRZWZmmT5+u3bt3SyLBAgAAPmfLcjySsWDBAm3fvl2TJk06597GjRvV3t6u9vZ2PfDAA4nr9fX1qqur0759+7R8+XItWbJEEgkWAACAJGn27NkqKiq66Pd3d3crEomourpaklRVVaXOzk5Fo1EWuQMAAH8zZmA4mSdJPT09Q64HAgEFAoGkPmvRokWybVu33HKLGhsbNWHCBMViMRUWFio7eyCdsixLoVBIXV1dVLAAAIC/XeoarOLiYo0bNy4xGhsbk/r+Dz/8UDt37lQkElF+fr5qamoS9yxraBvSnMnqqGABAICMFovFFAwGE6+TrV6FQiFJ0qhRo/TEE0+orKxM0kDiFo/H1dfXp+zsbBljFIvFFAqFqGABAAB/u9RF7sFgcMhIJsE6ceKEjh07lni9fv16VVZWSpIKCgpUWVmplpYWSVJra6vC4bDC4TAVLAAA4G+XugbrYi1dulSbN2/WkSNHdOedd2rs2LF69913VVVVpf7+fhljVFpaqnXr1iXmNDU1qba2Vg0NDQoGg2pubpZEixAAAECStHr1aq1evfqc65999tmIc8rLy9XW1nbOdRIsAADga7acPVeQZxECAACMwBhLxjh4FqGDOW5hkTsAAIDLqGABAABfMw6eK3h2nldIsAAAgK+l4xosWoQAAAAuo4IFAAB8LR0XuZNgAQAAX6NFCAAAACpYAADA32yHuwidzHELCRYAAPA1c2Y4mecVWoQAAAAuo4IFAAB8jRbhMEaF+zW6JNXfcnnkKeZ1CAB8JeB1ACmQaY2NHK8DcNdprwPwhjHOjlzw8iT3TPudBAAA4DlahAAAwNfS8RwsEiwAAOBr6bgGixYhAACAy6hgAQAAX0vHc7BIsAAAgK8Zhy1CdhECAABkECpYAADA19JxkTsJFgAA8LV0XINFixAAAMBlVLAAAICv0SIEAABwGS1CAAAAUMECAAD+lo4tQkcVrC1btuimm25SZWWlpk6dqubmZrfjAgAAkPR9guVkeCXpCpYxRg899JDef/993XDDDYpGo5oyZYruu+8+XX311amIEQAAIK04bhEeO3ZMktTT06P8/HwFAgHXggIAADgrHRe5J51gWZalDRs26L777tOYMWP073//W5s2bdLo0aNTER8AALjCXRFrsPr6+tTY2KjNmzfr0KFD2rZtm2pqavTNN9+kIj4AAIC0k3SC1d7ersOHD+vWW2+VJE2bNk2FhYXauXOn68EBAACYSxheSTrBKi4uVjwe1969eyVJ+/fv14EDB1RWVuZ6cAAAALYc7iL0MOak12BNnDhRTU1NWrBggbKysmSM0Zo1a/TjH/84FfEBAACkHUe7CB988EE9+OCDbscCAABwjitiFyEAAMDlZBy2+0w67SIEAADA+VHBAgAAvpaOLUIqWAAAwNcGdgUaByO573n88ccVDodlWZZ27dqVuN7R0aGZM2eqrKxM06dP1+7duy94jwQLAABA0oIFC7R9+3ZNmjRpyPX6+nrV1dVp3759Wr58uZYsWXLBeyRYAADA1y7XQaOzZ89WUVHRkGvd3d2KRCKqrq6WJFVVVamzs1PRaPS891iDBQAAfM0Yh2uwzkzq6ekZcj0QCCgQCFzUZ8RiMRUWFio7eyBlsixLoVBIXV1dGjNmzIj3qGABAICMVlxcrHHjxiVGY2NjUvMtyxry2gw6/2Gke1SwAACArzl97M3ZRe6xWEzBYDBx/WKrV9L3jwjs6+tTdna2jDGKxWIKhULKzc0d8R4VLAAA4Gu2jOMhScFgcMhIJsEqKChQZWWlWlpaJEmtra0Kh8MKh8PnvUcFCwAAQNLSpUu1efNmHTlyRHfeeafGjh2r/fv3q6mpSbW1tWpoaFAwGFRzc3Nizkj3SLAAAICvXeoi94u1evVqrV69+pzr5eXlamtrG3bOSPdIsAAAgK8NbvclO88rKU+wTpfdoFPXBy/8xjQwWsNnr+kqTzGvQwDgOxe/NiU9ZNpS4xyvA8BFooIFAAB8zZbDXYRuB5IEEiwAAOBrl2sNlpsyrXYKAADgOSpYAADA11jkDgAA4DLj8CR3WoQAAAAZhAoWAADwNXPmh5N5XiHBAgAAvmYbh2uwPOwR0iIEAABwGRUsAADga+wiBAAAcFk6Jli0CAEAAFxGBQsAAPgauwgBAABcRosQAAAAVLAAAIC/pWMFiwQLAAD4mi1nzyJ0MscttAgBAABcRgULAAD4GrsIAQAAXGYcPovQ8CxCAACAzEEFCwAA+Jpt2bKs5Jes2x4ucyfBAgAAvmbLluUgWfIywaJFCAAA4DIqWAAAwNdsGYcVLHYRAgAADMucOcvdyTyv0CIEAABwGRUsAADga7ZlZFk8ixAAAMA17CIEAAAAFSwAAOBv6VjBIsECAAC+xi5CAAAAUMECAAD+xrMIAQAAXGZkO0qWaBECAABkECpYAADA1waqV7QIhxgVnqfR5SWp/prL4pTXAbhstNq8DsFVeYp5HQIA3wl4HYDLrszGk1G/jINfu1F/Uu8Ph8PKyclRTk6OJOm3v/2tHnjgAXV0dKimpkZff/218vLy9Nprr+m6664772dRwQIAADhj48aNmjp16pBr9fX1qqurU21trTZu3KglS5aore38RYorMxUGAABpw04sc0/2x6U/i7C7u1uRSETV1dWSpKqqKnV2dioajZ53HhUsAADgawMtQsvRPEnq6ekZcj0QCCgQGL59vGjRItm2rVtuuUWNjY2KxWIqLCxUdvZAymRZlkKhkLq6uhQOh0f8bipYAAAgoxUXF2vcuHGJ0djYOOz7PvzwQ+3cuVORSET5+fmqqamRNJBUDWbMhStjVLAAAICvXeouwlgspmAwmLg+UvUqFApJkkaNGqUnnnhCZWVlKi4uVjweV19fn7Kzs2WMUSwWS7x3JFSwAACArzlbf/X94aTBYHDIGC7BOnHihI4dO5Z4vX79elVWVqqgoECVlZVqaWmRJLW2tiocDp+3PShRwQIAANCXX36pqqoq9ff3yxij0tJSrVu3TpLU1NSk2tpaNTQ0KBgMqrm5+YKfR4IFAAB87VIXuV+M0tJSffbZZ8PeKy8vv+CxDD9EggUAAHzNNg7XYBmeRQgAAJAxqGABAABfM2eOGnUyzyskWAAAwNfSMcGiRQgAAOAyKlgAAMDXjLGT2hE4eJ5Xhq1gPf744wqHw7IsS7t27Upc7+jo0MyZM1VWVqbp06dr9+7dly1QAABwZXL+qGefJVgLFizQ9u3bNWnSpCHX6+vrVVdXp3379mn58uVasmTJZQkSAAAgnQybYM2ePVtFRUVDrnV3dysSiai6ulqSVFVVpc7OTkWj0ZQHCQAArlxnF7k7GV656EXusVhMhYWFys4eWLZlWZZCoZC6urpSFhwAAIAxtuPhlaR2EVrW0GPqjTGuBgMAAJAJLnoXYXFxseLxuPr6+pSdnS1jjGKxmEKhUCrjAwAAV7iBVp+TZxGmQQWroKBAlZWVamlpkSS1trYqHA4rHA6nKjYAAIDMaREuXbpURUVFisfjuvPOO/WTn/xEktTU1KSmpiaVlZXp+eef15/+9KfLGiwAAEA6GLZFuHr1aq1evfqc6+Xl5Wpra0t5UAAAAGc5OWT0Uua5gZPcAdSai2IAAAWLSURBVACArw20+hyswfJbixAAAADOUcECAAC+ZmQkBzsCB+Z5gwQLAAD4mjH9koNkiRYhAABABqGCBQAAfM3pgaFeHjRKggUAAHzNNraDPYS0CAEAADIKFSwAAOBrtAgBAABcxi5CAAAAUMECAAD+5rQS5WUFiwQLAAD4nNNEKQMTrO+++06StOefh1P1FZfd6WiP1yG4alSnd08ZT4XTmfOfWsJ/jn7rdQiu+qYns34PfX3C6wjc9+XJXq9DcNXXvaO8DsFVX5/OvJU9kUhEU6ZMUW5urtehuCplCVY0GpUkPVL9P6n6CuAKkFkJidThdQAAfKb1pv+nv//97/rZz3424nt4FuEgc+bMUUtLi8LhsH70ox+l6msAAECamzJlyvnfYGzJyVGjxrsEyzLGw28HAAAYQU9Pj8aNG6csKyjLSj7BMsbINj06fvy4gsFgCiIcGYvcAQCAzzmsYGViixAAAMANxmGC5eUarMzbjpDGTp48qXvvvVdlZWWqqKjQ3LlzE5sF4C/PPvusLMvSrl27vA4FP9Db26vHHntMkydP1vXXX6/q6mqvQ8IPbNmyRTfddJMqKys1depUNTc3ex3SFe3xxx9XOBw+58+0jo4OzZw5U2VlZZo+fbp2797tYZTphwTLZ+rq6rR37161t7dr/vz5qqur8zok/EAkEtFHH32kUCjkdSgYxooVK5SVlaV9+/bpiy++0O9//3uvQ8Igxhg99NBDWrt2rT777DO99dZbqq+v13/+8x+vQ7tiLViwQNu3b9ekSZOGXK+vr1ddXZ327dun5cuXa8mSJR5FqIFF7k6HR0iwfCQnJ0fz5s1LLOSbMWOGDh486HFUGKy3t1dLly7VmjVrHC24RGqdOHFCa9euVUNDQ+Lfz7XXXutxVBjOsWPHJA0sYs7Pz1cgEPA4oivX7NmzVVRUNORad3e3IpFIogJcVVWlzs5Oz7oqRrbj4RUSLB9btWqV7rnnHq/DwCBPPfWUqqurVVJS4nUoGMaBAweUn5+vlStX6uabb9asWbO0bds2r8PCIJZlacOGDbrvvvs0adIk3XbbbWpubtbo0aO9Dg2DxGIxFRYWKjt7YKm2ZVkKhULq6uryOLL0QYLlUw0NDero6NBzzz3ndSg4o62tTTt27NCvfvUrr0PBCE6fPq2DBw/quuuu06effqpXXnlFCxcu1FdffeV1aDijr69PjY2N2rx5sw4dOqRt27appqZG33zzjdeh4Qd+WKX39lQnp+1BKlgY5MUXX9SmTZv09ttvZ9yjA9LZBx98oD179qikpEThcFjxeFxz5szR22+/7XVoOGPSpEnKysrSokWLJEk33nijSkpK9MUXX3gcGc5qb2/X4cOHdeutt0qSpk2bpsLCQu3cudPjyDBYcXGx4vG4+vr6JA0kV7FYzMO1p8Zhe5BdhDjjpZde0vr16/Xee+8pLy/P63AwyIoVK3T48GFFo1FFo1EVFRVpy5Ytuvvuu70ODWeMHz9eP//5z7VlyxZJ0qFDh9TZ2any8nKPI8NZZ//i3rt3ryRp//79OnDggMrKyjyODIMVFBSosrJSLS0tkqTW1laFw2GFw+HLGsfo0aN1zTXXSOp3PK655hpPWtCc5O4j8XhcxcXFKi0t1dVXXy1JCgQC+vjjjz2ODMMJh8N66623NHXqVK9DwSAHDx7U4sWLdfToUV111VV6+umn9ctf/tLrsDDI+vXr1dDQoKysLBlj9Lvf/U4LFy70Oqwr1tKlS7V582YdOXJE48eP19ixY7V//37t3btXtbW1Onr0qILBoJqbm3X99ddf9vhOnjypU6dOOZ4/evRo5eTkuBjRxSHBAgAAcBktQgAAAJeRYAEAALiMBAsAAMBlJFgAAAAuI8ECAABw2f8H9y/tEWgikYAAAAAASUVORK5CYII=" }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heatmap(\n", " vec2Img(\n", " Arotate*img2Vec(image)\n", " ),\n", " yflip = true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(c) Translate up and 2 right by 2 pixels..." ] }, { "cell_type": "code", "execution_count": 198, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 198, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#This is the function for it (without thinking about matrix multiplication)\n", "\n", "function translateUpRight(img)\n", " outImage = zeros(N,N)\n", " for i in 1:N-2\n", " for j in 3:N\n", " outImage[i,j] = img[i,j-2]\n", " end\n", " end\n", " outImage\n", "end\n", "\n", "#testIt\n", "heatmap(\n", " translateUpRight(image),\n", " yflip = true) #note the heatmap renormalizes the colours..." ] }, { "cell_type": "code", "execution_count": 199, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10×10 Array{Float64,2}:\n", " 0.0 0.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0 81.0\n", " 0.0 0.0 9.0 16.0 25.0 36.0 49.0 64.0 81.0 100.0\n", " 0.0 0.0 16.0 25.0 36.0 49.0 64.0 81.0 100.0 121.0\n", " 0.0 0.0 25.0 36.0 49.0 64.0 81.0 100.0 121.0 144.0\n", " 0.0 0.0 36.0 49.0 64.0 81.0 100.0 121.0 144.0 169.0\n", " 0.0 0.0 49.0 64.0 81.0 100.0 121.0 144.0 169.0 196.0\n", " 0.0 0.0 64.0 81.0 100.0 121.0 144.0 169.0 196.0 225.0\n", " 0.0 0.0 81.0 100.0 121.0 144.0 169.0 196.0 225.0 256.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" ] }, "execution_count": 199, "metadata": {}, "output_type": "execute_result" } ], "source": [ "translateUpRight(image)" ] }, { "cell_type": "code", "execution_count": 221, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100×100 Array{Float64,2}:\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " ⋮ ⋮ ⋱ ⋮ \n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" ] }, "execution_count": 221, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#this is then the linear transformation\n", "Atranslate = makeA(translateUpRight)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Testing it:" ] }, { "cell_type": "code", "execution_count": 222, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 222, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heatmap(\n", " vec2Img(\n", " Atranslate*img2Vec(image)\n", " ),\n", " yflip = true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(d) Smooth (average of pixels)" ] }, { "cell_type": "code", "execution_count": 229, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 229, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Statistics\n", "\n", "m1(i) = max(i,1)\n", "mN(i) = min(i,N)\n", "\n", "d = 2\n", "\n", "#This is the function for it (without thinking about matrix multiplication)\n", "#It takes the average of the neighbouring d cells in each direction m1() and mN() are used for the edges\n", "function smooth(img)\n", " outImage = zeros(N,N)\n", " for i in 1:N\n", " for j in 1:N\n", " outImage[i,j] = mean(img[m1(i-d):mN(i+d),m1(j-d):mN(j+d)])\n", " end\n", " end\n", " outImage\n", "end\n", "\n", "#testIt\n", "heatmap(\n", " smooth(image),\n", " yflip = true) #note the heatmap renormalizes the colours..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Note image looks the same, but slightly different" ] }, { "cell_type": "code", "execution_count": 228, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10×10 Array{Int64,2}:\n", " 4 9 16 25 36 49 64 81 100 121\n", " 9 16 25 36 49 64 81 100 121 144\n", " 16 25 36 49 64 81 100 121 144 169\n", " 25 36 49 64 81 100 121 144 169 196\n", " 36 49 64 81 100 121 144 169 196 225\n", " 49 64 81 100 121 144 169 196 225 256\n", " 64 81 100 121 144 169 196 225 256 289\n", " 81 100 121 144 169 196 225 256 289 324\n", " 100 121 144 169 196 225 256 289 324 361\n", " 121 144 169 196 225 256 289 324 361 400" ] }, "execution_count": 228, "metadata": {}, "output_type": "execute_result" } ], "source": [ "image" ] }, { "cell_type": "code", "execution_count": 227, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10×10 Array{Float64,2}:\n", " 17.3333 22.1667 27.6667 … 83.6667 102.667 112.167 122.333\n", " 22.1667 27.5 33.5 93.5 113.5 123.5 134.167\n", " 27.6667 33.5 40.0 104.0 125.0 135.5 146.667\n", " 38.6667 45.5 53.0 125.0 148.0 159.5 171.667\n", " 51.6667 59.5 68.0 148.0 173.0 185.5 198.667\n", " 66.6667 75.5 85.0 … 173.0 200.0 213.5 227.667\n", " 83.6667 93.5 104.0 200.0 229.0 243.5 258.667\n", " 102.667 113.5 125.0 229.0 260.0 275.5 291.667\n", " 112.167 123.5 135.5 243.5 275.5 291.5 308.167\n", " 122.333 134.167 146.667 258.667 291.667 308.167 325.333" ] }, "execution_count": 227, "metadata": {}, "output_type": "execute_result" } ], "source": [ "smooth(image)" ] }, { "cell_type": "code", "execution_count": 230, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "100×100 Array{Float64,2}:\n", " 0.111111 0.111111 0.111111 … 0.0 0.0 0.0 \n", " 0.0833333 0.0833333 0.0833333 0.0 0.0 0.0 \n", " 0.0666667 0.0666667 0.0666667 0.0 0.0 0.0 \n", " 0.0 0.0666667 0.0666667 0.0 0.0 0.0 \n", " 0.0 0.0 0.0666667 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 … 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0833333 0.0833333 0.0833333 … 0.0 0.0 0.0 \n", " 0.0625 0.0625 0.0625 0.0 0.0 0.0 \n", " 0.05 0.05 0.05 0.0 0.0 0.0 \n", " ⋮ ⋱ \n", " 0.0 0.0 0.0 0.0625 0.0625 0.0625 \n", " 0.0 0.0 0.0 0.0833333 0.0833333 0.0833333\n", " 0.0 0.0 0.0 … 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.0 … 0.0666667 0.0 0.0 \n", " 0.0 0.0 0.0 0.0666667 0.0666667 0.0 \n", " 0.0 0.0 0.0 0.0666667 0.0666667 0.0666667\n", " 0.0 0.0 0.0 0.0833333 0.0833333 0.0833333\n", " 0.0 0.0 0.0 0.111111 0.111111 0.111111 " ] }, "execution_count": 230, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#this is then the linear transformation\n", "Asmooth = makeA(smooth)" ] }, { "cell_type": "code", "execution_count": 231, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 231, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heatmap(\n", " vec2Img(\n", " Asmooth*img2Vec(image)\n", " ),\n", " yflip = true)" ] }, { "cell_type": "code", "execution_count": 232, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10×10 Array{Float64,2}:\n", " 17.3333 22.1667 27.6667 … 83.6667 102.667 112.167 122.333\n", " 22.1667 27.5 33.5 93.5 113.5 123.5 134.167\n", " 27.6667 33.5 40.0 104.0 125.0 135.5 146.667\n", " 38.6667 45.5 53.0 125.0 148.0 159.5 171.667\n", " 51.6667 59.5 68.0 148.0 173.0 185.5 198.667\n", " 66.6667 75.5 85.0 … 173.0 200.0 213.5 227.667\n", " 83.6667 93.5 104.0 200.0 229.0 243.5 258.667\n", " 102.667 113.5 125.0 229.0 260.0 275.5 291.667\n", " 112.167 123.5 135.5 243.5 275.5 291.5 308.167\n", " 122.333 134.167 146.667 258.667 291.667 308.167 325.333" ] }, "execution_count": 232, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vec2Img(\n", " Asmooth*img2Vec(image)\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "f: [-1,1] \\to \\mathbb{R}\n", "\\qquad\n", "\\alpha = \\int_{-1}^1 f(x) \\, dx.\n", "$$\n", "\n", "$$\n", "\\hat{\\alpha} = w_1 f(t_1) + \\ldots w_n f(t_n)\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(a) Take $f(\\cdot)$ is a polynomial of degree $d$:\n", "$$\n", "f(x) = \\beta_0 + \\beta_1 x + \\ldots + \\beta_d x^d\n", "$$\n", "\n", "Hence in this case,\n", "$$\n", "\\alpha = \\beta_0 x \\Big|^1_{-1} + \\beta_1 \\frac{1}{2} x^2 \\Big|^1_{-1}\n", "+ \\beta_2 \\frac{1}{3} x^3 \\Big|^1_{-1} + \\ldots + \n", "\\beta_d \\frac{1}{d+1} x^{d+1} \\Big|^1_{-1}\n", "= 2 \\Big( \\beta_0 +\\frac{1}{3} \\beta_2 + \\frac{1}{5} \\beta_4 + \\ldots \\Big)\n", "$$\n", "\n", "Now\n", "$$\n", "\\hat{\\alpha} = (w_1 + \\ldots + w_n) \\beta_0 + (w_1 t_1 + \\ldots+ w_n t_n)\\beta_1 +\n", "(w_1 t_1^2 + \\ldots + w_n t_n^2) \\beta_2 + \\ldots\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now equate coefficients of $\\alpha$ and $\\hat{\\alpha}$ to get the system of equations $A x = b$ where $A$ is $(d+1) \\times n$:\n", "\n", "$$\n", "\\left[\\begin{matrix}\n", "1 & 1 & \\ldots & 1\\\\\n", "t_1 & t_2 & \\ldots &t_n \\\\\n", "t_1^2 & t_2^2 & \\ldots & t_n^2 \\\\\n", "\\vdots & \\vdots & & \\vdots \\\\\n", "\\vdots & \\vdots & & \\vdots \\\\\n", "\\vdots & \\vdots & & \\vdots \\\\\n", "t_1^d & t_2^d & \\ldots & t_n^d\n", "\\end{matrix}\\right]\n", "\\left[\\begin{matrix}\n", "w_1 \\\\\n", "w_2 \\\\\n", "w_3 \\\\\n", "\\vdots \\\\\n", "\\vdots \\\\\n", "\\vdots \\\\\n", "w_n\n", "\\end{matrix}\\right]\n", "=\n", "2\n", "\\left[\\begin{matrix}\n", "1 \\\\\n", "0 \\\\\n", "1/3 \\\\\n", "0 \\\\\n", "1/5 \\\\\n", "0 \\\\\n", "\\vdots \\\\\n", "\\end{matrix}\\right]\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Here is a little demonstration that it works..." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "18.08015200031334" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Random\n", "Random.seed!(0)\n", "f(x) = 6 + 34x + 9x^2 - 5x^3 + 0.2x^4 + 3x^5 \n", "d = 5\n", "δ = 0.00001\n", "alpha = sum([f(x)*δ for x in -1:δ:1])" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6×6 Array{Float64,2}:\n", " 1.0 1.0 1.0 1.0 1.0 1.0 \n", " -0.670868 -0.645342 -0.593047 -0.44224 0.647295 0.820713\n", " 0.450064 0.416467 0.351705 0.195576 0.418991 0.67357 \n", " -0.301934 -0.268764 -0.208577 -0.0864915 0.271211 0.552808\n", " 0.202558 0.173445 0.123696 0.03825 0.175553 0.453696\n", " -0.13589 -0.111931 -0.0733576 -0.0169157 0.113635 0.372355" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 6;\n", "ts = sort(2*rand(n).-1) # some arbitrary t values\n", "\n", "A = [ts[j]^i for i in 0:d, j in 1:n]" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6-element Array{Float64,1}:\n", " 2.0 \n", " 0.0 \n", " 0.6666666666666666\n", " 0.0 \n", " 0.4 \n", " 0.0 " ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = 2*[(i%2)/i for i in 1:d+1]" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6-element Array{Float64,1}:\n", " -69.86735359420322 \n", " 131.08788006208087 \n", " -71.2221609271108 \n", " 11.313909446190433 \n", " 0.4283850586230596\n", " 0.2593399544196729" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = A \\ b" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "18.080000000000176" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w'*f.(ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(b) and (c): Considering different rules:\n", "\n", "(i) Trapezoid rule $n=2$ $t_1 = -1$, $t_2 = 1$, $w_1=w_2 = 1/2$\n", "\n", "$d=1$ so $A$ is $2 \\times 2$:\n", "\n", "$$\n", "A = \\left[\\begin{matrix}\n", "1 & 1 \\\\\n", "-1 & 1\n", "\\end{matrix}\\right].\n", "$$\n", "\n", "Now $b = [2 ~~ 0]^T$ and we need to see that $w = [1/2 ~~ 1/2]^T$ satisfies $A w = b$.\n", "\n", "But it **doesn't** there was a mistake in the problem. It should have been $w_1=w_2 = 1$." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Int64,1}:\n", " 0\n", " 0" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = [1 1; -1 1]; b = [2,0];\n", "w = [1,1]\n", "A*w - b" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.8921669822053007" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(x) = x != 0 ? sin(x)/x : 1 #can't evaluate sin(x)/x at x = 0, however the limit is 1\n", "δ = 0.000001\n", "alpha = sum([f(x)*δ for x in -1:δ:1]) " ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.682941969615793" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = [-1,1]; w=[1,1]\n", "alphaHat = w'*f.(ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we get $\\hat{\\alpha} = 1.6829$ vs. $\\alpha = 1.8921$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(ii) Simpson's rule" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3×3 Array{Int64,2}:\n", " 1 1 1\n", " -1 0 1\n", " 1 0 1" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = [-1,0,1]; w = [1/3, 4/3, 1/3];\n", "d = 2; n = 3;\n", "A = [ts[j]^i for i in 0:d, j in 1:n]" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3-element Array{Float64,1}:\n", " 2.0 \n", " 0.0 \n", " 0.6666666666666666" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = 2*[(i%2)/i for i in 1:d+1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Now see it satisfies $A w = b$. So yes it is order $d=2$" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3-element Array{Float64,1}:\n", " -2.220446049250313e-16\n", " 0.0 \n", " 0.0 " ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A*w - b" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.8943139898719308" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alphaHat = w'*f.(ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we get $\\hat{\\alpha} = 1.8943$ vs. $\\alpha = 1.8921$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(ii) Simpson's $3/8$ rule" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4×4 Array{Float64,2}:\n", " 1.0 1.0 1.0 1.0\n", " -1.0 -0.333333 0.333333 1.0\n", " 1.0 0.111111 0.111111 1.0\n", " -1.0 -0.037037 0.037037 1.0" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = [-1, -1/3,1/3,1]; w = [1/4,3/4,3/4,1/4];\n", "d = 3; n = 4;\n", "A = [ts[j]^i for i in 0:d, j in 1:n]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Now see it satisfies $A w = b$. So yes it is order $d=3$\n" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4-element Array{Float64,1}:\n", " 2.0 \n", " 0.0 \n", " 0.6666666666666666\n", " 0.0 " ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = 2*[(i%2)/i for i in 1:d+1]" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4-element Array{Float64,1}:\n", " 0.0 \n", " -1.3877787807814457e-17\n", " 0.0 \n", " 0.0 " ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A*w - b" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.8931116279866331" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alphaHat = w'*f.(ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we get $\\hat{\\alpha} = 1.8931$ vs. $\\alpha = 1.8921$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(d) Let's get even closer with an order $4$ rule that we find" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5×5 Array{Float64,2}:\n", " 1.0 1.0 1.0 1.0 1.0\n", " -1.0 -0.5 0.0 0.5 1.0\n", " 1.0 0.25 0.0 0.25 1.0\n", " -1.0 -0.125 0.0 0.125 1.0\n", " 1.0 0.0625 0.0 0.0625 1.0" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = 4;\n", "n = 5;\n", "ts = [-1,-1/2,0,1/2,1] #just some sensible grid\n", "A = [ts[j]^i for i in 0:d, j in 1:n]" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5-element Array{Float64,1}:\n", " 2.0 \n", " 0.0 \n", " 0.6666666666666666\n", " 0.0 \n", " 0.4 " ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = 2*[(i%2)/i for i in 1:d+1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So these are our weights:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5-element Array{Float64,1}:\n", " 0.15555555555555545\n", " 0.7111111111111117 \n", " 0.2666666666666662 \n", " 0.7111111111111111 \n", " 0.15555555555555553" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = A \\ b" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.892156949525523" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alphaHat = w'*f.(ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we get $\\hat{\\alpha} = 1.8921569$ vs. $\\alpha = 1.8921669$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 8" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want $a b^T = b a^T$. This means the matrix $A = a b^T$, is symmetric since $A^T = (a b^T)^T = b a^T$. Hence first we must have that $a$ and $b$ are of the same length. \n", "\n", "Since we want $A_{ij} = A_{ji}$ it means that \n", "\n", "$$\n", "a_i b_j = a_j b_i.\n", "$$\n", "\n", "If all of $a = 0$ or $b=0$ this would hold immediatly. However assume $b\\neq 0$ via $b_i \\neq 0$. Now divide to get\n", "\n", "$$\n", "\\frac{a_j}{a_i} = \\frac{b_j}{b_i}.\n", "$$\n", "\n", "Hence the vectors $a$ and $b$ must have an angle of $0$ between them.\n", "\n", "A different (cleaner) way to arrive a this is via $a b^T = b a^T$. Left multiply by $b^T$ and right multiply by $a$:\n", "\n", "$$\n", "b^T a b^T a = b^T b a^T a\n", "$$\n", "\n", "$$\n", "(b^T a)^2 = b^T a b^T a = ||b||^2 ||a||^2\n", "$$\n", "\n", "$$\n", "\\frac{a^Tb}{||b|| ||a||} = 1\n", "$$\n", "\n", "Hence the angle between the vectors needs to be $0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$A$ and $B$ are $m \\times n$. \n", "\n", "(a) $A^TB$ is $n \\times n$ with $i,j$ element \n", "$$\n", "\\sum_{k=1}^m A^T_{ik} B_{kj} = \\sum_{k=1}^m A_{ki} B_{kj}\n", "$$\n", "The trace is the sum over all $i,i$ elements (for $i =1,\\ldots, n$)\n", "$$\n", "tr(A^TB) = \\sum_{i=1}^n \\sum_{k=1}^m A_{ki} B_{ki}\n", "$$\n", "which we can also write with index $j$ instead of $k$ if we like and change the summation order and role of variables to arrive at the desired expression.\n", "\n", "Here is an example in Julia (even though it was not required)." ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([1 2 1; 1 2 1], [1 2 2; 2 1 2])" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Random.seed!(0)\n", "n = 2;m=3;\n", "A = rand([1,2],n,m)\n", "B = rand([1,2],n,m)\n", "A,B" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3×3 Array{Int64,2}:\n", " 3 3 4\n", " 6 6 8\n", " 3 3 4" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A'*B #we see the trace is 3+6+4" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tr(A'*B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the formula...." ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(A.*B) #element wise multiplication" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(b) \n", "We already showed:\n", "$$\n", "tr(A^TB) = \\sum_{i=1}^m \\sum_{j=1}^n A_{ij} B_{ij}\n", "$$\n", "\n", "The same formula with $A$ and $B$ switched gives:\n", "$$\n", "tr(B^TA) = \\sum_{i=1}^m \\sum_{j=1}^n B_{ij} A_{ij}\n", "$$\n", "\n", "We thus see $tr(A^TB) = tr(B^TA)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(c) From (a): $tr(A^T A) = \\sum_{i=1}^m \\sum_{j=1}^n A_{ij} A_{ij}$\n", "\n", "$$\n", "= \\sum_{i=1}^m \\sum_{j=1}^n A_{ij}^2 = ||A||^2.\n", "$$ \n", "(Frobenius norm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(d) We have\n", "\n", "$$\n", "tr(A^TB) = \\sum_{i=1}^m \\sum_{j=1}^n A_{ij} B_{ij}\n", "$$\n", "\n", "Using the same formula, and $A^T = (A^T)^T$, $B = (B^T)^T$:\n", "\n", "$$\n", "tr(BA^T) = \\sum_{i=1}^m \\sum_{j=1}^n B^T_{ij} A^T_{ij} = \\sum_{i=1}^m \\sum_{j=1}^n B_{ji} A_{ji}\n", "$$\n", "\n", "and after changing indexes $i$ and $j$ this equals $tr(A^TB)$.\n", "\n", "As an example, consider the case of $A$ and $B$ being vectors ($m=n$ and $n=1$). The trace of the inner product is just the trace of a scalar. The trace of the outer product is the innder product. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution to Question 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It turns out that $A_i = Q_i R_i$ is the QR factorization of the first $A_i$ because every additional column in $A$ only gives and additional collumn in $Q_i$ and expands the dimension of the square matrix $R_i$ by $1$ without touching the submatrix. The two equations that show this are:\n", "\n", "(page 97 of [VMLS] in Gram-Schmidt algorithm):\n", "$$\n", "\\tilde{q}_i = a_i -(q_1^T a_i)q_1 - \\ldots - (q_{i-1}^Ta_i)q_{i-1}\n", "$$\n", "\n", "(distilled page 190 in [VMLS]):\n", "$$\n", "R_{ij} = \n", "\\begin{cases}\n", "q_i^T a_j & i < j \\\\\n", "||\\tilde{q}_i|| & i =j \\\\\n", "0 & i >j\n", "\\end{cases}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Here is a demonstration" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5×4 Array{Int64,2}:\n", " -1 1 1 0\n", " 1 -1 0 1\n", " 0 -1 1 1\n", " 0 0 -1 1\n", " -1 1 0 0" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Random.seed!(0)\n", "n = 5; k = 4;\n", "A = rand([-1,0,1],n,k)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank(A) #to make sure it is full rank (rank = 4)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LinearAlgebra.QRCompactWY{Float64,Array{Float64,2}}\n", "Q factor:\n", "5×5 LinearAlgebra.QRCompactWYQ{Float64,Array{Float64,2}}:\n", " -0.57735 0.0 -0.516398 -0.507093 -0.377964\n", " 0.57735 0.0 -0.258199 -0.676123 0.377964\n", " 0.0 1.0 0.0 0.0 0.0 \n", " 0.0 0.0 0.774597 -0.507093 -0.377964\n", " -0.57735 0.0 0.258199 -0.169031 0.755929\n", "R factor:\n", "4×4 Array{Float64,2}:\n", " 1.73205 -1.73205 -0.57735 0.57735 \n", " 0.0 -1.0 1.0 1.0 \n", " 0.0 0.0 -1.29099 0.516398\n", " 0.0 0.0 0.0 -1.18322 " ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F = qr(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This loop shows that all sub-QR factorizations hold... notice the norms of differences are almost 0" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.9229626863835638e-16\n", "2.7194799110210365e-16\n", "2.984744261173718e-16\n", "3.2126737200132e-16\n" ] } ], "source": [ "for i in 1:k\n", " subA = A[:,1:i]\n", " subQ = F.Q[:,1:i]\n", " subR = F.R[1:i,1:i]\n", " println( norm(subA - subQ*subR))\n", "end" ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.1.1", "language": "julia", "name": "julia-1.1" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.1.1" } }, "nbformat": 4, "nbformat_minor": 2 }