For extra credit on this assignment I implemented the "speedup". This extra makes calculating the eigenfaces much faster by reducing the dimensions of the covariance matrix (instead of n squared by n squared where n is the height or width of a square image, it is reduced to m by m where m is the number of images). The observation that makes this speedup possible is that if we multiply the eigenvectors of aTa (where a is an array and T means transpose) by a, we get back vectors that are equivalent (possibly with a change in sign) to the eigenvectors of aaT.