What I have done, and what we do in our commercial game engine, is to store the matrix and only recalculate it if something changed. To avoid recalculating on every change though, we just set a flag that lets us know the matrix is "dirty" and needs to be recalculated.

Say we change the camera position. We set the vector describing the camera position and set a dirty flag. The next time the scene is drawn, we check the dirty flag. Because it is set, we recalculate the projection matrix, use it, and store it. Next frame, if the camera didn't move, we just use the stored matrix.

We do this for our views, our models, animations, everything that can be stored and re-used without having to recalculate the same thing over and over if nothing changed.