/////////////////////////////////////////////////////////////////////////////// // return determinant of 4x4 matrix /////////////////////////////////////////////////////////////////////////////// float Matrix4::getDeterminant() { return m[0] * getCofactor(m[5],m[6],m[7], m[9],m[10],m[11], m[13],m[14],m[15]) - m[1] * getCofactor(m[4],m[6],m[7], m[8],m[10],m[11], m[12],m[14],m[15]) + m[2] * getCofactor(m[4],m[5],m[7], m[8],m[9], m[11], m[12],m[13],m[15]) - m[3] * getCofactor(m[4],m[5],m[6], m[8],m[9], m[10], m[12],m[13],m[14]); }
void minverse(double ***im, int n, double ***om) { int i, j, s = 0; double d = det(im, n); printf("cofactor of [%d][%d] : %lf\n", 2, 2, getCofactor(im, 1, 1, n)); printf("det : %lf\n", d); for (i = 0; i < n; i++) for (j = 0; j < n; j++, s++) (*om)[i][j] = getCofactor(im, i, j, n) * (s % 2 == 0 ? 1. : -1.) / d; madjugate(om, n); }
int main() { int M[MAXITEM][MAXITEM], C[MAXITEM][MAXITEM], T[MAXITEM][MAXITEM]; int i, j; printf("Enter a 3x3 matrix and the program will produce the adjoint:\n"); for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 3 ; j++) { scanf("%d", &M[i][j]); } } //-- Producing the cofactor matrix for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 3 ; j++) { C[i][j] = getCofactor(M, i, j); } } //-- Generate the transpose of the cofactor matrix for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 3 ; j++) { T[i][j] = C[j][i]; } } //-- Display the final matrix printf("The adjoint is:\n"); for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 3 ; j++) { printf("%4d ", T[i][j]); } printf("\n"); } return 0; }
/////////////////////////////////////////////////////////////////////////////// // compute the inverse of a general 4x4 matrix using Cramer's Rule // If cannot find inverse, return indentity matrix // M^-1 = adj(M) / det(M) /////////////////////////////////////////////////////////////////////////////// Matrix4& Matrix4::invertGeneral() { // get cofactors of minor matrices float cofactor0 = getCofactor(m[5],m[6],m[7], m[9],m[10],m[11], m[13],m[14],m[15]); float cofactor1 = getCofactor(m[4],m[6],m[7], m[8],m[10],m[11], m[12],m[14],m[15]); float cofactor2 = getCofactor(m[4],m[5],m[7], m[8],m[9], m[11], m[12],m[13],m[15]); float cofactor3 = getCofactor(m[4],m[5],m[6], m[8],m[9], m[10], m[12],m[13],m[14]); // get determinant float determinant = m[0] * cofactor0 - m[1] * cofactor1 + m[2] * cofactor2 - m[3] * cofactor3; if(fabs(determinant) <= 0.00001f) { return identity(); } // get rest of cofactors for adj(M) float cofactor4 = getCofactor(m[1],m[2],m[3], m[9],m[10],m[11], m[13],m[14],m[15]); float cofactor5 = getCofactor(m[0],m[2],m[3], m[8],m[10],m[11], m[12],m[14],m[15]); float cofactor6 = getCofactor(m[0],m[1],m[3], m[8],m[9], m[11], m[12],m[13],m[15]); float cofactor7 = getCofactor(m[0],m[1],m[2], m[8],m[9], m[10], m[12],m[13],m[14]); float cofactor8 = getCofactor(m[1],m[2],m[3], m[5],m[6], m[7], m[13],m[14],m[15]); float cofactor9 = getCofactor(m[0],m[2],m[3], m[4],m[6], m[7], m[12],m[14],m[15]); float cofactor10= getCofactor(m[0],m[1],m[3], m[4],m[5], m[7], m[12],m[13],m[15]); float cofactor11= getCofactor(m[0],m[1],m[2], m[4],m[5], m[6], m[12],m[13],m[14]); float cofactor12= getCofactor(m[1],m[2],m[3], m[5],m[6], m[7], m[9], m[10],m[11]); float cofactor13= getCofactor(m[0],m[2],m[3], m[4],m[6], m[7], m[8], m[10],m[11]); float cofactor14= getCofactor(m[0],m[1],m[3], m[4],m[5], m[7], m[8], m[9], m[11]); float cofactor15= getCofactor(m[0],m[1],m[2], m[4],m[5], m[6], m[8], m[9], m[10]); // build inverse matrix = adj(M) / det(M) // adjugate of M is the transpose of the cofactor matrix of M float invDeterminant = 1.0f / determinant; m[0] = invDeterminant * cofactor0; m[1] = -invDeterminant * cofactor4; m[2] = invDeterminant * cofactor8; m[3] = -invDeterminant * cofactor12; m[4] = -invDeterminant * cofactor1; m[5] = invDeterminant * cofactor5; m[6] = -invDeterminant * cofactor9; m[7] = invDeterminant * cofactor13; m[8] = invDeterminant * cofactor2; m[9] = -invDeterminant * cofactor6; m[10]= invDeterminant * cofactor10; m[11]= -invDeterminant * cofactor14; m[12]= -invDeterminant * cofactor3; m[13]= invDeterminant * cofactor7; m[14]= -invDeterminant * cofactor11; m[15]= invDeterminant * cofactor15; return *this; }