give a few minutes, and will post what I have in C++.... here it goes (does not verify if the determinant is a non-zero and zero error checking):
typedef float M3[9];
static void test1 (void)
{
M3 origMat;
origMat[0] = 1.0;
origMat[1] = 3.0;
origMat[2] = 0.0;
origMat[3] = 5.0;
origMat[4] = 7.0;
origMat[5] = 0.0;
origMat[6] = 10.0;
origMat[7] = 10.0;
origMat[8] = 1.0;
M3 finalMat;
finalMat[0] = 11.0;
finalMat[1] = 13.0;
finalMat[2] = 0.0;
finalMat[3] = 17.0;
finalMat[4] = 19.0;
finalMat[5] = 0.0;
finalMat[6] = 20.0;
finalMat[7] = 5.0;
finalMat[8] = 1.0;
float det;
det = origMat[0] * (origMat[4] * origMat[8] - origMat[7] * origMat[5])
- origMat[1] * (origMat[3] * origMat[8] - origMat[6] * origMat[5])
+ origMat[2] * (origMat[3] * origMat[7] - origMat[6] * origMat[4]);
M3 invMat;
invMat[0]=(((origMat[4] * origMat[8]) - (origMat[5] * origMat[7])) / det);
invMat[1]=(-(((origMat[1] * origMat[8]) - (origMat[7] * origMat[2]))) / det);
invMat[2]=(((origMat[1] * origMat[5]) - (origMat[4] * origMat[2])) / det);
invMat[3]=(-(((origMat[3] * origMat[8]) - (origMat[5] * origMat[6]))) / det);
invMat[4]=(((origMat[0] * origMat[8]) - (origMat[6] * origMat[2])) / det);
invMat[5]=(-(((origMat[0] * origMat[5]) - (origMat[3] * origMat[2]))) / det);
invMat[6]=(((origMat[3] * origMat[7]) - (origMat[6] * origMat[4])) / det);
invMat[7]=(-(((origMat[0] * origMat[7]) - (origMat[6] * origMat[1]))) / det);
invMat[8]=(((origMat[0] * origMat[4]) - (origMat[1] * origMat[3])) / det);
M3 m;
m[0]=invMat[0] * finalMat[0] + invMat[1] * finalMat[3] + invMat[2] * finalMat[6];
m[1]=invMat[0] * finalMat[1] + invMat[1] * finalMat[4] + invMat[2] * finalMat[7];
m[2]=invMat[0] * finalMat[2] + invMat[1] * finalMat[5] + invMat[2] * finalMat[8];
m[3]=invMat[3] * finalMat[0] + invMat[4] * finalMat[3] + invMat[5] * finalMat[6];
m[4]=invMat[3] * finalMat[1] + invMat[4] * finalMat[4] + invMat[5] * finalMat[7];
m[5]=invMat[3] * finalMat[2] + invMat[4] * finalMat[5] + invMat[5] * finalMat[8];
m[6]=invMat[6] * finalMat[0] + invMat[7] * finalMat[3] + invMat[8] * finalMat[6];
m[7]=invMat[6] * finalMat[1] + invMat[7] * finalMat[4] + invMat[8] * finalMat[7];
m[8]=invMat[6] * finalMat[2] + invMat[7] * finalMat[5] + invMat[8] * finalMat[8];
acutPrintf(_T("\n (%g %g %g) (%g %g %g) (%g %g %g) \n"), m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
}