realloc with smaller size will just free the remaining memory. So you can do that.
So you create an eigen view to the full matrix, which only accesses the submatrix that you want to return. Do multiplication into that one (previous centring can be done in place as said above). Then do a re-allocation of the underlying SGMatrix to the size of the corresponding eigen3 view. You  might have to experiment a bit with this as it depends on the way the matrix is stored in memory (column, or row wise) If all this doesnt work, you can also do the projection vector by vector (should not be much slower), as this will work for sure.
Let me know if you have questions. And please do proper unit testing of this as its complicated and hard to foresee.
http://stackoverflow.com/questions/9575122/can-i-assume-that-calling-realloc-with-a-smaller-size-will-free-the-remainder