{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "26bd27ec-6f63-41dc-89f2-14b5f0b410bd",
   "metadata": {},
   "source": [
    "### <center>San Jose State University<br>Department of Applied Data Science<br><br>**DATA 200<br>Computational Programming for Data Analytics**<br><br>Spring 2024<br>Instructor: Ron Mak</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "635b659b-fbe5-4f36-81ca-3fe379482772",
   "metadata": {},
   "source": [
    "# Matrix Operations with `numpy`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa7a96db-ef76-4ecb-9412-fd2059f0ec73",
   "metadata": {},
   "source": [
    "## Buying fruit\n",
    "\n",
    "#### Suppose you want to buy a number of apples, bananas, and oranges.\n",
    "| Fruit | Number |\n",
    "| :--:  | :--:   |\n",
    "| Apples | 6 |\n",
    "| Bananas | 3 |\n",
    "| Oranges | 10 |\n",
    "#### Two stores, A and B, sell individual fruits at different prices:\n",
    "| Store | Apples | Bananas | Oranges |\n",
    "| :--:  | :--:   | :--:  | :--:   |\n",
    "| **A** | 0.10 | 0.40 | 0.10 |\n",
    "| **B** | 0.15 | 0.30 | 0.20 |\n",
    "#### What is the total purchase price at each store?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "32717092-722d-40b8-ab2f-aefc353e71a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "store_A_total = 6*0.10 + 3*0.40 + 10*0.10\n",
    "store_B_total = 6*0.15 + 3*0.30 + 10*0.20\n",
    "\n",
    "print(f'(Store A total = ${store_A_total:.2f}')\n",
    "print(f'(Store B total = ${store_B_total:.2f}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "71296704-8648-42db-b9c7-67966f4d7d9b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8056c399-369d-4aac-a244-26aeef97de1d",
   "metadata": {},
   "source": [
    "#### Mathematicians call a 2-d array a **matrix** and a 1-d array a **vector**.\n",
    "\n",
    "#### We can represent the store prices as a matrix and the numbers of fruits as a vector. Using numpy, a matrix is a 2-d array and a vector is a 1-d array. But we want the fruit numbers in a **column vector**, which in `numpy` is a 2-d array with only one element in each row."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cfd04cb1-4825-470a-8dc2-800490dd6525",
   "metadata": {},
   "outputs": [],
   "source": [
    "prices = np.array([[0.10, 0.40, 0.10],\n",
    "                   [0.15, 0.30, 0.20]])\n",
    "\n",
    "fruits = np.array([[ 6],\n",
    "                   [ 3],\n",
    "                   [10]]) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c48d7214-5fcf-4eb3-86b1-f2352ec57463",
   "metadata": {},
   "source": [
    "#### When we **sum the products** of corresponding elements of two vectors, we are creating what mathematicians call a **dot product**. Therefore, to get the store totals, we calculated two dot products:\n",
    "- Dot product 1: First row of the prices matrix and the fruits vector.\n",
    "- Dot product 2: Second row of the prices matrix and the fruits vector.\n",
    "#### A dot product is always a scalar (a single value, not a vector or matrix)."
   ]
  },
  {
   "attachments": {
    "c48e1661-cf48-49ed-8ca5-ee733ff3b79b.png": {
     "image/png": "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JEACJEACJECBjfcACZAACZAACZAACTQ4AQpsDd5B1ajezz//bGbNmmWwzStMnz7d/PTTT6mzq0Yd0hT+6aefms8++yxN0tRpvvnmG/Ptt9+mTl+NOqQpPO9ym6XP07BhGhIgARJodAIU2Bq9h3Ks31tvvWX69u1rFl54YbPCCiuYhRZayPTu3du89NJLZZfy5ptvmh122MGstNJK5rXXXiuZTzXqULJQSXDWWWeZHj16mMUWW8wsuuiipnv37ub444+vWGi98MILzQILLGCZlqpHtepQ63Kbpc9LceF5EiABEmgqAgFDSxCYMmVKsPTSSwdycwbDhw8Pxo0bF/z617+2xyK4BU899VQmDl999VUgAk8w77zz2jyQ7z//+c/EPPKuQ2Jhv5wUTZ5tL+q32mqrBZdddlkwatSooGPHjrbee++9d/DDDz+kyaoojQifQfv27W0+4BAXqlmHuDIRn3e5zdLnSUx4jgRIgASalYBp1oqz3v9P4LHHHgu22267or8bb7zRJerVq5cVLAYOHOjiZAgzWGeddWx8z549XXypnVtuuSUQDZ29DoKQ/k2bNi3x0jzrkFiQd/Kuu+6y9ZtnnnmCqVOnujO33nqrq/dNN93k4tPuQBjacsstXR5JAlu16lCqrnmWW4s+h+AcdR8fdthhpZrK8yRAAiTQ5glQYGsDXXz99ddbwQFaowkTJrg/FVBeeOEFJ1honDb70ksvdeeef/55jY7dXnvttTY9tHOPPvpocNxxx7nroXGKC3nWIa6MqHgZrrX123333YtOd+7c2Z6TYeKic6UiLrroInvtsssua7dJAlu16lCqjnmVW6s+xweEf//uueeelu0GG2xQqqk8TwIkQAJtngAFtjbQxSqwLb744pGtOfjgg+2LD0Of0Az5AUKWash+//vf+6ci9zEsNn78eJfP2LFj3fVJAluedYisWETkO++8E8wxxxy2fuecc05Rin333deem3POOQNZiFB0Pi5ixowZdkh1ueWWC2QOm80jTmCrVh3i6qbxeZZbrz4/7bTTLFsKbNqr3JIACbQyAS46EGmlrQddDLDmmmuadu3aFTQXiw9E2LBxIogUnIs6wAR7mfdVlE9UWj8uzzr4+Sbtv/HGG25Rwdprr12UdNVVV7VxWN369ttvF52PizjwwAPNF198YbDgQIZa45LZ+GrVIbFQOZln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Uwc//3L3s5Yb1+dwMaXtg99VsNM/+Cvt37+/ZTNmzJiCqma973A/Rt3HSfdVQYE8IAESIIE2TCC1L9E2zKAlmgaBQ4yV2hfriBEjgvvuuy9QP5BiRysQjVIBh7iXNxLJUKJ1aA5fj506dbJ5QigSLUtw5ZVX2pe5eA4oyE+FINRh2LBhwT333BPAiTp8fOJaGZYMRNtXcE0eB6L5cg7uZdgyEK1jMG7cuEAWDdhyR48eXVSM1jVKYENdRXsVwMn7M888Y7cyV8vmJRrKAufomnE5ddBrK9lmLTeuz8V9metjtD/uD2zDIet9F76exyRAAiRAAv8jQIGthe6E6667LhBr/k5wk/liATRr0NCFw+233+5ezDKcWXAajt/jXtoaf8wxxxRcg5c5nKyrpk/TyZBlsNtuu1khsOCCHA9k0rvVAkEoRLnQFvXo0SMIa4S0yHXXXdemQ3oNcP4uw4IBhFutO7bt27cPZBg0OOOMMwJoiOJC1jrE5ZM1Pku5UX0uw+wF7fXbHt6/8847I6uX5b6LzICRJEACJEACQTswkAcvQwsRwOq8Tz75xHTp0sW6pqpl03G7Yb4XDLvC5dmiiy5as+JRNuamiVbQYKFBuQFzvTC/DVsYy8X8v7QhrzqkLU/T1atcLR/bet53fj24TwIkQALNSIACWzP2GutMAiRAAiRAAiTQUgS4SrSlupuNJQESIAESIAESaEYCFNiasddYZxIgARIgARIggZYiQIGtpbqbjSUBEiABEiABEmhGAhTYmrHXWGcSIAESIAESIIGWIkCBraW6m40lARIgARIgARJoRgIU2Jqx11hnEiABEiABEiCBliJAga2lupuNJQESIAESIAESaEYCFNiasddYZxIgARIgARIggZYiQIGtpbqbjSUBEiABEiABEmhGAhTYmrHXWGcSIAESIAESIIGWIkCBraW6m40lARIgARIgARJoRgIU2Jqx11hnEiABEiABEiCBliJAga2lupuNJQESIAESIAESaEYCFNiasddYZxIgARIgARIggZYiQIGtpbqbjSUBEiABEiABEmhGAhTYmrHXWGcSIAESIAESIIGWIkCBraW6m40lARIgARIgARJoRgIU2Jqx11hnEiABEiABEiCBliJAga2lupuNJQESIAESIAESaEYCFNiasddYZxIgARIgARIggZYiQIGtpbqbjSUBEiABEiABEmhGAhTYmrHXWGcSIAESIAESIIGWIkCBraW6m40lARIgARIgARJoRgIU2Jqx11hnEiABEiABEiCBliJAga2lupuNJQESIAESIAESaEYCFNiasddYZxIgARIgARIggZYiQIGtpbqbjSUBEiABEiABEmhGAhTYmrHXWGcSIAESIAESIIGWIkCBraW6m40lARIgARIgARJoRgIU2Jqx16pc559++sm8++67VS6F2ZMACZAACZAACaQlMFfahEzXmAR+/vln8+WXX0ZWbt555zX4SxO+/vprc+mll5rrrrvOTJkyxfzwww/m5ZdfNj179kxzuUvz+eefu31/Z+655zbzzz+/H8V9EiABEiABEiCBlAQosKUE1ajJZsyYYbp27RpZvRNOOMGcfPLJkef8yDfeeMP079/fvPbaa6ZDhw6mX79+ZpVVVjGLLLKInyzVfqdOnSLTDRgwwIwbNy7yHCNJgARIgARIgASSCVBgS+bTVGdPP/10K3hppRdeeGHdjd1OmDDBDBkyxGrpBg4caMaMGWOFttgLSpyYNm1aQYrNNtvMvPPOOwVxPCABEiABEiABEshGgAJbNl4NnXrJJZeM1bZFVXzixIlm7733tqcGDRpkLr/8cjPHHJVNawxr++aai7dYFHvGkQAJkAAJkEAWAnybZqHVhtJiYcHw4cNti/bYYw9zxRVXmHbt2rWhFrIpJEACJEACJNB2CFSmTmk7HFquJVhggEUFCKNGjaKw1nJ3ABtMAiRAAiTQTASoYWum3sqxrqNHj7a5YRXo2muvbd5//32DxQeffvqp2Xjjjc3SSy+dY2nMigRIgARIgARIoBICFNgqodek13788cduIcCqq65qttpqK/Pwww8XtAaC3B133GG6dOlSEM8DEiABEiABEiCB2hPgkGjtmde9RJjv0HDLLbfY4dCrr77a3H777ebYY481c845p3n11VdNnz59zOzZszUptyRAAiRAAiRAAnUiQA1bncDXs1hfYIMpkKOPPtpVZ8cdd7QC2ymnnGJef/11A4Fu8ODB7jx3SIAESIAESIAEak+AGrbaM697iTC2q2HffffVXbfdfvvt3f7kyZPdPndIgARIgARIgATqQ4ACW32417XUJZZYwpUfBIHb151evXqZjh072sOpU6dqNLckQAIkQAIkQAJ1IkCBrU7g61nsCius4IrH6tBwgLFbFdhWXHHF8GkekwAJkAAJkAAJ1JgABbYaA2+E4nr06OGq8cILL7h93YFpjw8++MAebrTRRhrNLQmQAAmQAAmQQJ0IUGCrE/h6Frv66qsbnad28cUXmx9++KGgOhdccIGBJ4R5553XbL755gXneEACJEACJEACJFB7AlwlWnvmDVHiqaeeap555hmDRQV9+/Y1hx9+uJl//vnNnXfeac4991wrrN12222mW7duDVFfVoIESIAESIAEWpkABbYW7X14N3jppZfMwQcfbOAE/oEHHrAkOnfubPr162cOOuggs/XWW7coHTabBEiABEiABBqLAAW2xuqPmtZm+eWXN3fffbfBStHp06ebeeaZxyy77LI1rQMLIwESIAESIAESKE2AAltpRm0+Rbt27cxKK63U5tvJBpIACZAACZBAsxLgooNm7TnWmwRIgARIgARIoGUIUGBrma5mQ0mABEiABEiABJqVAAW2Zu051psESIAESIAESKBlCFBga5muZkNJgARIgARIgASalQAFtmbtOdabBEiABEiABEigZQhQYGuZrmZDSYAESIAESIAEmpUABbZm7TnWmwRIgARIgARIoGUIUGBrma5mQ0mABEiABEiABJqVQCbDuR999JH529/+Zl0avf3229bf5K677mqOOuqoZm0/600CJEACJEACJEACDU8gtYbtvvvuM127djVjxowxyyyzjPnmm2+s8/DPP/+8Lo388ccfzTbbbGO23HJLM378+LrUoS0Win6dMWOGAV8GEiABEiABEiCBxiCQSmD717/+ZXbffXfz1Vdfmdtuu81cfPHF5qqrrrLC0nbbbVeXlsBxORyWP/LII6Z9+/Z1qUNbKPTnn3+2HPfee28Dx+9gueKKK9otHMRTGG4Lvcw2kAAJkAAJNDuBVEOiZ5xxhoEmrXfv3mbTTTe1bd5oo43MQw89VLf2v/HGG2aJJZaw5W+yySZF9Zg9e7Z1ZA5N0WeffWbmm2++ojSMMGavvfYyN954o0Xx61//2owcOdK888475oYbbjAvv/yyGTBggHnrrbfMH//4R+IiARIgARIgARKoE4GSGjYIO9ddd52t3s4771ynahYXC0Higw8+sH+LLbZYUQJoAr/88kurLaKwVoTHRUBrigBh7YknnjBHHHGEOeuss8wrr7xi5plnHnvuoosuslv+IwESIAESIAESqA+BkgLb2LFjzbfffmtrhzljSeGHH36w2pmoNNDSvPfeewWnIFDNnDmzIC7NQRAEdg4dhEmUGQ5ff/21OfPMM230xhtvHD5ddIz8/vOf/5hZs2ZZTWJRgjYc0b17d9OrVy9z9tlnF7RyoYUWMttuu62NQ7+h/xhIgARIgARIgATqQyBWYLv++uvNDjvsULACdK211rJzmzp27Gi+++47V+Pvv//eDB061EDTteyyy5r99tvPnvvvf/9rr+/SpYtdsIBzENIgAB500EEGQgHObb311i4v3fn000/tMCa0YxMmTNBo87vf/c7MOeecZoEFFjCLLLKIufnmm905DNsOGjTIrLHGGmbq1Kk2/sorr7R1xtws/KFOGjCsimHeTp06meWXX96ssMIKdh+LKg455BBN1qa30KY999xzZsMNN4xtJ/pgueWWiz3PEyRAAiRAAiRAAtUlEDuHDZqrbt262ZWgn3zyiVlttdXsqkxUZ+GFF7YmPbCPuWK77LKLmTx5sll//fXNww8/bK699lrzhz/8wS5UgNZqwQUXRFKbx08//WT69u1rTYNsvvnmdh4c5sJhCA6CloZnn33WCYUQFDVgeG6uueYyV1xxhY2CdkgDVjhC+FpllVWcRmj//fc3HTp0sEkg5EFIRMA8rXXXXddq6jAM+Nvf/tYKeeecc47dTps2zaYr9x+E1n//+99lXX7ggQdawbOsi3O6CH2OvkSAZnXuuefOKWdmQwIkQAIkQAIkkJVArMA2cOBAgz+dv4b9Y445pih/2GN7//33zeOPP24WXXRRq2HDysM99tjDClbTp0+3Q6EQuqDFeffdd82HH35oHnvsMSs8YUUigq+xw/EzzzyDjRUOISxqmH/++c3iiy9uD7GFUKlhySWXNH/9618NhK57773XCm+XXnqpmWOOYkXiP/7xDyusYUgQ6REwfArtWp8+fRI1Tlpe0nbSpEnm1VdfTUoSe67U0HPshTmdgHZyp512squCV155ZQMtJQMJkAAJkAAJkED9CMQKbKgStEwwlouwwQYb2G34X48ePczrr79uo5988kl3+uOPP7ZaMwhV+MM8MQ2aHrbdNEBw8oMKbL/61a9Mu3bt/FNuuBMrVaPCU089ZaMhgEUJazgJzR/CF198YYdJVfMGMyV33XWXWXPNNe35cv+hbdD4lROiFlGUk0+Wa6DhxNAz+lC1m1gxesIJJxgMgTOQAAmQAAmQAAnUj0CiwKaCDwQmf+gxrrp40WuAgV01u6Fx4e3zzz9vozB3TIctEQHhTvPC6sVw8IW58Dkca70h7MUFDMfCXAmGRjfbbDM7jIshWbQVGrZKAzR1zRT+/ve/m9NOO62gytBCrr766nUfni2oFA9IgARIgARIoAUJFI8VehBU8IH2S+eheaeLdjU9FhL069ev6Hw44tFHH7VREJj8AKO4mBuHEBbYoPXDkCpC1ApQWOnX1ajha+1Fv/yDJu3oo4+2R1OmTLHz7yDAYTi3FQNYQCsK22swioyhUMzBGzx4sDn22GNbEQnbTAIkQAIkQAINQyCVhi1pBaHfEh0S7d+/vx8duY9FDU8//bQ9B22XH2C0FQET3cOaPRUKsfAgfA7X6HkMhcYN4yIdwumnn24FwgMOOMAKgaNGjbLDwJdddtn/ElTwf/jw4W7hQ9ZsMF9wzz33zHpZRelhcw1zEPGH4WAswoCnAwjIEGSxiGLVVVetqAxeTAIkQAIkQAIkUB6BWIENJjJee+01m2spwQeJsLgAiw8QwgKYjQz9gyYH9tIQfvOb37izsK129dVX22Os4sQiAz/ocCgWMWDVZzjoeWgF/WHWcDo93nHHHe3iAGgEJ06caC6//HJz+OGHG8zNqyRAe1juooMoQbSSupRzLUygQICFMAutIwRhCmzlkOQ1JEACJEACJFA5gViBDYKPDg+m0bCpdg1VilsM4FdX7aRBqIJTeQ0jRoyw3gtwvM4662i028J2GkLUOcSrOQ7fRAi0eVjoAM0R5sddcsklZosttnACCBZFYMI97MQhYCiwUoHtpptusjbnbIYZ/zWKzTOYR9EA+3kMJEACJEACJEAC9SEQK7DpcCU0XGlWTOpQJMxsYFitVMBcMwQY0YWmDdqyo446yjqXX2mllexwIkx+4DxMhMDq/rBhw5xAhnlyMAUCX5jQ6EHQQ4DBXQRd3Qqjvhjeg5N4LDDA/DYY+cWw4zXXXGPT4h80exowFFhpCK96rTS/al1/6qmn2vmCJ598cpG/Vcxp0xDlr1XPcUsCJEACJEACJFBdArGLDlQAgyYL88VKBdWwRS0EiLpWncjDOTu0Xeutt545//zzraYLwhgCBCpo6zBUqUIjvBsgjB8/3i46gL01307blltuac/DzhuGO3HugQcesPnCPIUOmd5yyy0GwgoM/t5xxx3m0EMPtdeh/lq+jWjj/2CI+C9/+YtlEW6q2l+DoWTfeHE4HY9JgARIgARIgASqSyBSYMNQqAo2aYZDoenS+W5phkPRJMxbw7wxLCyAayTk8eCDD1ohCysT5513XmtvDW6RIAyqhgeCFeIwNAoTHJgrBvdSGjA5HnVAG+655x7TuXNnc//991vvCkiD1a5oE4ZJjzvuOOvtAEZisTJ1yJAhNq3m1UpbCG1HHnmk7QP0w+67727uvPNO6/4L2zh7dq3EiG0lARIgARIggXoRaCdzuv7fou0vtYARVdVo3Xbbbdb1VLUqCBdIGBINz9tCPLRv8F4QDhiqg4urqHOaFsOfGGaFdigqYKgV5kFgOBfurHT+WlTaRo6DU3adAwhzHPC1miVgPh/6GFpMXQSC6zEsDVdjJ554orXFliVPPy20lTNnzjQDBgww48aN809xnwRIgARIgARIICWByLFOaKYQoMmqtpskNSURrm/SPLg0ngCgWUsKaBscvrd6OOiggwz+ECAIY6UvjP7q0HOr82H7SYAESIAESKARCEQKbJjfhYA5YFGmMxqh4qxD/gQgCKcRhvMvmTmSAAmQAAmQAAkkESgQ2DDM+Le//c3OKcPqUMxrYiABEiABEiABEiABEqgvASewwa8nXDlhMj6GI7FCs5VWS9a3G1g6CZAACZAACZAACcQTcAIbhDS4IMJkc6zITJpDFp8dz5AACZAACZAACZAACeRNwAlsENSOOOKIvPNnfiRAAiRAAiRAAiRAAhUSiLTDVmGevJwESIAESIAESIAESCBHAhTYcoTJrEiABEiABEiABEigGgQosFWDKvMkARIgARIgARIggRwJUGDLESazIgESIAESIAESIIFqEKDAVg2qzJMESIAESIAESIAEciRAgS1HmM2W1fTp061P1rT1/vnnn82sWbMMtgwkQAIkQAIkQAK1I0CBrXasG6akN9980+ywww7W5t5rr71Wsl5wMN+3b1+z8MILmxVWWMEstNBCpnfv3uall14qeS0TkAAJkAAJkAAJVE6AAlvlDJsmh6+//tr88Y9/ND169DB33XWXrfd8882XWP9XXnnFGlK+++67zX777WfGjRtn1lxzTfPggw+aLbbYwjz99NOJ1/MkCZAACZAACZBA5QSc4dzKs2IOjUzg1ltvNUceeaSZOXNmQTXnnHPOguPwwf7772/ee+89M3DgQHP++efb03vvvbdZf/31zeTJk82QIUMMhDoGEiABEiABEiCB6hGghq16bBsm5/Hjx5t+/fqZZZdd1jz66KPmuOOOc3WbY474W+DFF1808DGLcMwxxxRcM3ToUHv86quvmhdeeMGd4w4JkAAJkAAJkED+BOLf1vmXxRzrRGDXXXc1ENomTpxoNttsM7PKKqukqsnll19u02HOWvfu3Quu2Xrrrd3x9ddf7/a5QwIkQAIkQAIkkD8BCmz5M224HBdYYAGDYcx27dplqpsuSMCctfC1WHww77zz2vxmzJiRKV8mJgESIAESIAESyEaAAls2Xi2V+t1337XthYYtHDCUutxyy9noDz74IHyaxyRAAiRAAiRAAjkSoMCWI8y2lpUKbB06dIhsmsZTYIvEw0gSIAESIAESyI0ABbbcULatjD7//HPzzTffJDZKTYJ89dVXiel4kgRIgARIgARIoDICFNgq49dmr8a8N5239v3330e2U+MXX3zxyPOMJAESIAESIAESyIcABbZ8OLa5XOaaay6zyCKL2HZB2xYVNH7JJZeMOs04EiABEiABEiCBnAhQYMsJZFvMZokllrDN+uyzzyKbN3v2bBu/1FJLRZ5nJAmQAAmQAAmQQD4EKLDlw7FN5gLTHQjwZKDDn9rQDz/80Hz00Uf2cI011tBobkmABEiABEiABKpAgAJbFaA2epY//vijq+LPP//s9sM7u+++u4369ttvzaRJkwpOP/HEE/YYrq0GDBhQcI4HJEACJEACJEAC+RKgwJYvz6bIbdasWa6e8BMaF/r372+w+ADhrLPOcsmCIDBjxoyxx3369DEcEnVouEMCJEACJEACVSFA5+9VwVqfTDHX7J133nGFL7jggqZjx472eOrUqQYeCaZMmWL++te/ujTDhg0zRxxxhOnatav969y5szuHa+HwHQ7eb7nlFnPYYYeZvn37mptvvtk89NBDplu3buaCCy5w6bHjl4/jn376CRsGEiABEiABEiCBCgi0E21JUMH1vLTOBN566y0raEVV44QTTjAnn3yyPbXJJpuYJ598MiqZi4OD91NPPdUd686ECRNsPIQ+DKHC88Gmm25qLr74YrPMMstoMrtVUyAFkXKAYdNx48aFo3lMAiRAAiRAAiSQggAFthSQGjkJNFiffPJJZBXbt29v8JdXwKpQlNWlSxcD11RRAYsRogKM7ELjx0ACJEACJEACJJCdAAW27Mx4BQmQAAmQAAmQAAnUlEC0mqSmVWBhJEACJEACJEACJEACSQQosCXR4TkSIAESIAESIAESaAACFNgaoBNYBRIgARIgARIgARJIIkCBLYkOz5EACZAACZAACZBAAxCgwNYAncAqkAAJkAAJkAAJkEASAQpsSXR4jgRIgARIgARIgAQagAAFtgboBFaBBEiABEiABEiABJIIUGBLosNzJEACJEACJEACJNAABCiwNUAnsAokQAIkQAIkQAIkkESAAlsSHZ4jARIgARIgARIggQYgQIGtATqBVSABEiABEiABEiCBJAIU2JLo8BwJkAAJkAAJkAAJNAABCmwN0AmsAgmQAAmQAAmQAAkkEaDAlkSH50iABEiABEiABEigAQhQYGuATmAVSIAESIAESIAESCCJAAW2JDo8RwIkQAIkQAIkQAINQIACWwN0AqtAAiRAAiRAAiRAAkkEKLAl0eE5EiABEiABEiABEmgAAhTYGqATWAUSIAESIAESIAESSCJAgS2JDs+RAAmQAAmQAAmQQAMQoMDWAJ3AKpAACZAACZAACZBAEgEKbEl0eI4ESIAESIAEmpTATz/9ZN59990mrT2rHSYwVziCxyRAAiRAAiRAArUnMGzYMDNlypSigpdeemlz0003FcVHRXz99dfm0ksvNdddd53N64cffjAvv/yy6dmzZ1Ty2Lg///nP5t577408P3HiRNOuXbvIc4ysHgEKbNVjy5xJgARIgARIIDUBCGtPPvmk6datmxk+fLi7bsEFF3T7STtvvPGG6d+/v3nttddMhw4dTL9+/cwqq6xiFllkkaTLIs9tuOGGxi/37rvvNvfdd19kWkbWhgAFttpwZikkQAIkQAIkkIrAsssua0aMGJEqrSaaMGGCGTJkiPnyyy/NwIEDzZgxY6zQpuezbnv37m3wp+Hjjz+mwKYw6rSlwFYn8CyWBEiABEiABPIggCHKvffe22Y1aNAgc/nll5s55uAU9TzYNlIeFNgaqTdYFxIgARIgARLIQAALC3T4dI899jBXXHEF55dl4NdMSSmCN1Nvsa4kQAIkQAIk4BHAAgMsKkAYNWoUhTWPTVvbpYatrfUo20MCJEACJNAyBEaPHm3bilWga6+9tnn//fcN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770Xey1Whg4cONCef/jhh83kyZNd2scff9y8+uqr9njw4MEunjuNR4CeDhqvT1gjEiABEiCBFibw/PPPWx+higC+PtW11BdffGEmTZpk/Ylec801Rld4PvLII2bkyJFmiy22sL5ze/XqZXwTHocffrgRB/BWWNtzzz3NiSeeaL0fHHfccUacmZvRo0ebddddV4s0xx9/vLnjjjvcsQqGLoI7NSfQDl7na14qCyQBEiABEiABEiggAKEsSjDq2LGjc8r+4IMPmt69exdcFz6AoPbNN98YOEL3A/yEHnjggeahhx4yWHyAdKuvvro55JBDzNChQ/2kBsOk06ZNK4jTg0GDBukutzUkQIGthrBZFAmQAAmQAAnUmwD0NDNnzjSdOnWyCw3qXR+Wn44ABbZ0nJiKBEiABEiABEiABOpGgIsO6oaeBZMACZAACZAACZBAOgIU2NJxYioSIAESIAESIAESqBsBCmx1Q8+CSYAESIAESIAESCAdAQps6TgxFQmQAAmQAAmQAAnUjQAFtrqhZ8EkQAIkQAIkQAIkkI4ABbZ0nJiKBEiABEiABEiABOpGgAJb3dCzYBIgARIgARIgARJIR4ACWzpOTEUCJEACJEACJEACdSNAga1u6FkwCZAACZAACZAACaQjQIEtHSemIgESIAESIAESIIG6EaDAVjf0LJgESIAESIAESIAE0hGgwJaOE1ORAAmQAAmQAAmQQN0IUGCrG3oWTAIkQAIkQAIkQALpCFBgS8eJqUiABEiABEiABEigbgQosNUNPQsmARIgARIgARIggXQEKLCl48RUJEACJEACJEACJFA3AhTY6oaeBZMACZAACZAACZBAOgIU2NJxYioSIAESIAESIAESqBsBCmx1Q8+CSYAESIAESIAESCAdAQps6TgxFQmQAAmQAAmQAAnUjQAFtrqhZ8EkQAIkQAIkQAIkkI7A/wErKwfxEpr0fQAAAABJRU5ErkJggg=="
    }
   },
   "cell_type": "markdown",
   "id": "71734494-5c63-47e6-8771-e4c213bef2d4",
   "metadata": {},
   "source": [
    "#### We can use **matrix multiplication** to calculate the store totals:\n",
    "![Screenshot 2023-03-08 at 1.27.25 PM.png](attachment:c48e1661-cf48-49ed-8ca5-ee733ff3b79b.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "988f849f-53ad-4489-860f-e7b1abfde4bb",
   "metadata": {},
   "source": [
    "## Explicit dot product calculation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "104b1238-25b5-4699-b9fe-68bff828a111",
   "metadata": {},
   "outputs": [],
   "source": [
    "def AX_explicit(A, X):\n",
    "    \"\"\"\n",
    "    Multiply matrix A by column vector X \n",
    "    and return the result as a column vector.\n",
    "    Explicitly calculate the dot products.\n",
    "    Assume that the number of columns of A\n",
    "    is equal to the number of elements of X.\n",
    "    \"\"\"\n",
    "    row_count, col_count = A.shape\n",
    "    \n",
    "    y = []  # the result\n",
    "    \n",
    "    for i in range(row_count):\n",
    "        dot_product = 0\n",
    "        \n",
    "        # Calculate the dot product of a row of A\n",
    "        # and vector X. The result is an element of y.\n",
    "        for j in range(col_count):\n",
    "            dot_product += A[i][j]*X[j]\n",
    "            \n",
    "        y.append(dot_product)\n",
    "        \n",
    "    return np.array(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f8ab83e8-ffed-4d10-a6e7-1c953b4ba010",
   "metadata": {},
   "outputs": [],
   "source": [
    "costs = AX_explicit(prices, fruits)\n",
    "costs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8daa08f6-5639-45b8-b673-307db6c3320d",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(f'(Store A total = ${costs[0][0]:.2f}')\n",
    "print(f'(Store B total = ${costs[1][0]:.2f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b02fb2eb-ffdf-4b98-94d4-3bb4f4148219",
   "metadata": {},
   "source": [
    "## `np.dot()` function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c782ca74-dccb-45a9-805b-bc1c0f990e38",
   "metadata": {},
   "outputs": [],
   "source": [
    "def AX_dot_product(A, X):\n",
    "    \"\"\"\n",
    "    Multiply matrix A by column vector X \n",
    "    and return the result as a column vector.\n",
    "    Let numpy calculate the dot products.\n",
    "    Assume that the number of columns of A\n",
    "    is equal to the number of elements of X.\n",
    "    \"\"\"\n",
    "    rows_A = A[:, 0].size  # size of first column\n",
    "    \n",
    "    y = []  # the result\n",
    "    \n",
    "    for row in A:\n",
    "        dot_product = np.dot(row, X)  # or simply: row@X\n",
    "        y.append(dot_product)\n",
    "        \n",
    "    return np.array(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e2d2469-2b89-4991-b98c-26b390a9e442",
   "metadata": {},
   "outputs": [],
   "source": [
    "costs = AX_dot_product(prices, fruits)\n",
    "costs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2a3a7de-6d15-4647-bcdd-4f16966118d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(f'(Store A total = ${costs[0][0]:.2f}')\n",
    "print(f'(Store B total = ${costs[1][0]:.2f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1672b988-38c6-47bd-814d-e46fc8039305",
   "metadata": {},
   "source": [
    "## Matrix multiplication with `@`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cab2c119-15af-4bae-b0e9-2223b608f36a",
   "metadata": {},
   "outputs": [],
   "source": [
    "costs = prices@fruits\n",
    "costs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "be925394-a613-4b60-9e21-61292f23d917",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(f'(Store A total = ${costs[0][0]:.2f}')\n",
    "print(f'(Store B total = ${costs[1][0]:.2f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "117b86eb-203a-48d3-9c24-206e0619809c",
   "metadata": {},
   "source": [
    "## Hilbert matrices"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3a7ad62-649d-4617-8890-35e232cb5a33",
   "metadata": {},
   "source": [
    "#### A Hilbert matrix *H*<sub>*n*</sub> is an *n*-by-*n* square matrix where each element `h[i,j] = 1/(i+j+1)`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf2c95d0-6eed-4f8d-bcec-57a39d2e8d36",
   "metadata": {},
   "outputs": [],
   "source": [
    "N = 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce16df1e-d7a3-41f9-8f0d-a422a473ff28",
   "metadata": {},
   "outputs": [],
   "source": [
    "H = np.array( [[1.0/(i+j+1) for i in range(N)] for j in range(N)] )\n",
    "H"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef784965-7ea9-4052-a2f1-e0e146dd14fa",
   "metadata": {},
   "source": [
    "#### Hilbert matrices are prominent in linear algebra, so the `scipy.linalg` module has a `hilbert()` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "30e0a94b-3109-4586-a6d8-ff59847c3576",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.linalg import hilbert\n",
    "\n",
    "H = hilbert(N)\n",
    "H"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6bd26f0d-1e5e-407b-9d72-a786240b0440",
   "metadata": {},
   "source": [
    "#### Module `scipy.linalg` has a function that calculates the inverse of a matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10982a8d-8268-413a-a1fa-f94cbdc7161a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.linalg import inv\n",
    "\n",
    "H_inv = inv(H)\n",
    "H_inv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ebe5494-55e5-47f6-af7d-41fd359bd9b5",
   "metadata": {},
   "source": [
    "#### An *n*-by-*n* square matrix *A*<sub>*n*</sub> multiplied by its inverse *A*<sub>*n*</sub><sup>-1</sup> results in the identity matrix *I*<sub>*n*</sub> which is a square matrix with ones along the diagonal and zeros elsewhere.|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "20e865a6-5eeb-489a-b6c7-53314710cda3",
   "metadata": {},
   "outputs": [],
   "source": [
    "I = H@H_inv\n",
    "\n",
    "for row in I:\n",
    "    for elmt in row:\n",
    "        print(f'{elmt:4.0f}', end='')\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eed1cee9-3d96-4aef-b1fc-8260dc16e452",
   "metadata": {},
   "source": [
    "#### The identity matrix times a square matrix of the same size results in the square matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b3f3c70-4267-4527-ab82-94550ce1b8bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "H"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4fa8593e-ff3f-4e2d-a6bb-e6451a2723c0",
   "metadata": {},
   "outputs": [],
   "source": [
    "I@H"
   ]
  },
  {
   "attachments": {
    "b4e87278-d8f6-45cb-ac98-f9a98cae060b.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "283e41ed-59d1-4426-ae3f-8a9903cf7eb5",
   "metadata": {},
   "source": [
    "## Solving systems of linear equations\n",
    "\n",
    "#### Recall this terror from high-school algebra! Solve this system of linear equations for `x`, `y`, and `z`:\n",
    "![Screenshot 2023-03-08 at 1.33.11 PM.png](attachment:b4e87278-d8f6-45cb-ac98-f9a98cae060b.png)"
   ]
  },
  {
   "attachments": {
    "8df4a698-3e38-4329-87fd-ca2406abeabf.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "f51a5bb9-a2f9-4e68-b1e8-1e005d6106ae",
   "metadata": {},
   "source": [
    "#### Represent the problem as matrix multiplication. First, we define the matrix `A` and the vectors `X` and `Y`:\n",
    "![Screenshot 2023-03-08 at 1.43.30 PM.png](attachment:8df4a698-3e38-4329-87fd-ca2406abeabf.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86217b8d-2279-4e9a-abf0-06183b36ac00",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = np.array([[1, -1, -1],\n",
    "              [3, -3,  2],\n",
    "              [2, -1,  1]])\n",
    "\n",
    "Y = np.array([[ 2],\n",
    "              [16],\n",
    "              [9]])"
   ]
  },
  {
   "attachments": {
    "7444c6a0-7809-496d-929e-d0b1811c3e27.png": {
     "image/png": "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AOdefPFFfXdOOOEEt9122+n7NHfuXL2E/8OGDfOXx/7ng3zhhReWnEO4jBkzpuR4uQPdy51YvHixmzhxojbki1/8YnhZv379wu333nvPXXbZZe6MM85wfImg7t3LFhnel9WNFStWuG9+85vujjvuUBb33nvvrLJaka9q+4YHcfny5WF5s2fPdu+8847beeedMyMUnn32WX1BHn/8cTdu3Di3//77K7+o13xdEWq8dIccckjYjlZt/PznP3fXXXed23HHHV3//v1DNt56661wO26D/urWrZu74YYb3Kc//Wm9ZL/99lMBg5C56qqrKgoFbor25Z/+9Cd33333uU9+8pM1CQXU/VgSsHFqCuRrGXv+N7/5TSDMB2uuuWaw/fbb67VcLx0Ye32WD7755pvB9773vWCttdYKPvGJTwQ9evTQ9owdOzbLbJflrZG+EdVV237nnXeWLT/NEyK0gq222iqQr53y9ZGPfCQQYRC8++67waGHHho+d9dff32abJWt66ijjlKeTjzxxLLXxJ0QYRLcdtttJaeOPfZYLe9Tn/pUyblKB0TA670iFCpdWnC+bpuCNEC/JE8//bRj21MeNYV//etfKqEvv/xyR3sOO+wwbU4e2wLj7dQ3V155pQ5Xn3/+ede7d2/3yiuvuIceesidddZZ7pZbbnHnnXeeO/roo91ee+3lH8Fc/sd2MGTIkBLeeTahTTbZpORcsw7UreufffbZIU/PPfdcuJ3HDfn6FKhdojHksRkhz+3UN6LBOdEKVLXmpbn00kvdRRdd5H75y1/q9te//vWw3e228dprr4Uf3BEjRqTWvLqFQmocWkVtjwB2nOLpt3333dcNHz5c285YG0IbQCjMmzfPYYyLEwjz5893N910k14f/TNt2jSXN2H/ne98x73++utuwIABtdkEog2vY9uEQh2g2S3JIsCs1b///W/3/e9/X6fhKH3jjTcuqWS33XbTY7zcGBjjCEs7Rj4IQfPd735Xt7HK50koXHPNNW7WrFk6ZML42KVLF21HGn9yLxTEQuLuvffemv0jtt12W7fZZpulgXHVdbRTW6putFzoH/hjjjnG9enTp+ytfnqYl50ZCTFAllyL4PDCg/G4FwolF2b4ADMGYuTWmb+77rrLbbjhhqlym3uhwPTZoEGDagbtBz/4QeYemHZqS80dUuEGbAjYSpi/Z6rt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"
    }
   },
   "cell_type": "markdown",
   "id": "e4baf01c-0f05-43fc-8f93-9b05a2780c17",
   "metadata": {},
   "source": [
    "#### Then our system of linear equations becomes:\n",
    "![Screenshot 2023-03-08 at 1.46.58 PM.png](attachment:7444c6a0-7809-496d-929e-d0b1811c3e27.png)"
   ]
  },
  {
   "attachments": {
    "c71a6417-4156-45f2-8e97-5602737d198f.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "11bd4f3c-039d-4a7e-be70-63891e0e2d38",
   "metadata": {},
   "source": [
    "#### To solve for `X`, multipy both sides of the equation by the inverse of matrix `A`. Then `A` disappears from the left side and the inverse appears on the right side since *A*x*A*<sup>-1</sup> = *I*, and *I*x*X* = *X*:\n",
    "![Screenshot 2023-03-08 at 1.51.21 PM.png](attachment:c71a6417-4156-45f2-8e97-5602737d198f.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "99261d48-21be-4f09-a8f3-144a4c087552",
   "metadata": {},
   "outputs": [],
   "source": [
    "A_inv = inv(np.array(A))\n",
    "A_inv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95e32977-4540-4fa5-aab0-73ea0b01f3fb",
   "metadata": {},
   "source": [
    "#### Now we can calculate vector `X` which solves for `x`, `y`, and `z`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f0f87a20-8f14-4520-aa3b-d80d0f2ac1ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = A_inv@Y\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "243e0599-6519-49a5-949e-0c27620af602",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(f'x = {X[0][0]:4.1f}')\n",
    "print(f'y = {X[1][0]:4.1f}')\n",
    "print(f'z = {X[2][0]:4.1f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5489d564-c108-4f10-9414-fbfa2e5070dd",
   "metadata": {},
   "source": [
    "#### We can use function `solve()` from `scipy.linalg` which solves systems of linear equations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8ea62e2e-da3f-49be-89df-2c3832ed2965",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.linalg import solve\n",
    "\n",
    "X = solve(A, Y)\n",
    "X"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45fc987f-ff61-4c0b-a846-d450d467504d",
   "metadata": {},
   "source": [
    "#### Check our answers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "62b406da-f651-4b3d-aa14-3b2cd382dba3",
   "metadata": {},
   "outputs": [],
   "source": [
    "Y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "35ad32f8-01ed-4e1c-be82-4d0931a53985",
   "metadata": {},
   "outputs": [],
   "source": [
    "A@X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f74562fa-9714-443e-8f30-6e6968596cff",
   "metadata": {},
   "outputs": [],
   "source": [
    "# (C) Copyright 2024 by Ronald Mak"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
