Algorithms for Matrix Approximation: Sketching, Sampling, and Sparse Optimization