or alternatively I could use memcpy, however, for my application H is large and I was wondering whether there is a more intelligent way to do that. The sub-matrix I want to pass always starts from H[0] and is square.
There's only so much you can do here i think. The function you are passing the matrix to expects an array of doubles. In memory this means that each double will be 'beside' each other. If you want to pass only a subset of that array, you will have to make a new array and copy the new values into it. Alternatively you could reorder the original matrix, and then only send the function the first N*N valuse (N being the size of the sub-matrix), but i don't think that would be very easy to implement.
It shouldn't be that hard to write a function that accepts an integer and populates a sub-matrix from the original matrix, meaning you wouldn't have to copy the entries 'by hand' as in your example below