Matrix *Matrix_inverse(Matrix *mat){ double det=Matrix_determinant(mat); if(mat->rows != mat->cols || det == 0.0){ return Matrix_create(mat->rows, mat->cols); } Matrix *temp = Matrix_clone(mat); int n = temp->rows; int m = temp->cols; int i,j; double tempdet,val; Matrix *Cofactor = Matrix_create(n, m); for(j = 0; j < m; j++){ for(i = 0; i < n; i++){ Matrix *Mintemp = Matrix_minor(temp,i, j); tempdet = Matrix_determinant(Mintemp); Matrix_set(Cofactor,i,j,tempdet); } } Cofactor = Matrix_transpose(Cofactor); for(i = 0; i < n; i++){ for(j = 0; j < m; j++){ val=Matrix_get(Cofactor,i,j) * pow(-1.0,(i+j)) /det; if(isnan(val)) val=0; Matrix_set(Cofactor,i,j, val); //Cofactor.setValue(i, j, (Cofactor.getValue(i, j) * Math.pow(-1D, i + j + 2)) / det); } } return Cofactor; }
static void testDeterminant() { float determinant; determinant = Matrix_determinant(Matrix_identity()); TestCase_assert(fabs(determinant - 1.0f) < EPSILON, "Expected 1.0 but got %f", determinant); determinant = Matrix_determinant(Matrix_init(0.0f, 0.0f, 2.0f, 2.0f, 2.0f, 0.0f, 0.0f, 3.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f)); TestCase_assert(fabs(determinant - 8.0f) < EPSILON, "Expected 8.0 but got %f", determinant); }
void Matrix_invert(Matrix * matrix) { float determinant; Matrix result; int index, indexTransposed; int sign; determinant = Matrix_determinant(*matrix); for (index = 0; index < 16; index++) { sign = 1 - (((index % 4) + (index / 4)) % 2) * 2; indexTransposed = (index % 4) * 4 + index / 4; result.m[indexTransposed] = Matrix_subdeterminant(*matrix, index) * sign / determinant; } *matrix = result; }