cache mat-vec products so we don't recompute them a bunch