Monday, December 3, 2018

Understanding Beyond Libraries [Matrix Multiplying]

As engineers, we always go for something easy -- something reusable -- and this is the reason why libraries exist and play a great role in programming and software development in general.

To most, understanding the underlying formula for every calculation executed by the code is not that "important" and some doesn't even care at all -- as long as they see something is shown as output. This is why I wanted to take time to at least try my best to explain, why one needs to be curious enough to validate what a program does and tell.




This sample lines of code uses the python library numpy to calculate the output of c = a * b

The output of that equation is:

Now, while that answer is true and correct -- one might wonder, why? Well, I'm glad you asked.
Let's dissect the equation and see how numpy performs the calculation.


NOTE:

  • In multiplying matrices, make sure that the number of columns is equal to the number of rows. Ref: https://en.wikipedia.org/wiki/Matrix_(mathematics)
  • In multiplying matrices, order matters. (ie. Where c = a * b will not show the same result as c = b * a).

EXPLANATION:
  • (i) Take the first column set of a and multiply it with the first row set of b. (ii) Then take the first column set of a and multiply it with the second row set of b. The output should look like 
    • [[-1(-1), 0(-1), 4(2)], [ -1(1), 0(3), 4(4)]]
    • Where [-1(-1), 0(-1), 4(2)] is the output for i and [ -1(1), 0(3), 4(4)] is the output of ii
    • When we calculate this, i will result to 1, 0, 8 = 9 and ii will result to -1, 0, 16 = 15
    • Thus, making the answer [9, 15]
  • (iii) The the second column set of a and multiply it with the first row set of b. (iv) Then take the second column set of a and multiply it with the second row set of b. The output should look like
    • [[2(-1), 0(-1), 0(2)], [2(1), 0(3), 0(4)]]
    • Where [2(-1), 0(-1), 0(2)] is the output for iii and [2(1), 0(3), 0(4)] is the output of iv
    • When we calculate this, iii will result to -2, 0 , 0 = -2 and iv will result to 2, 0, 0 = 2
    • Thus, making our answer [-2, 2]
  • This is how numpy achieves the correct answer [[9, 15],[-2, 2]] -- in a much faster and accurate way.

Some references in dealing with numbers: