int Matrix_isIdentity(Matrix *m){ int i,j,rows=m->rows,cols=m->cols; for (i=0;i<rows;i++){ for (j=0;j<cols;j++){ if(i==j && Matrix_get(m,i,j)!=1) return(0); if(i!=j && Matrix_get(m,i,j)!=0) return(0); } } return(1); }
Matrix *Matrix_product(Matrix *m1, Matrix *m2){ int i,j,y; Matrix *c=Matrix_create(m1->rows,m1->cols); for(i =0;i<m1->rows; i++){ for(j=0;j<m2->cols; j++){ for(y=0;y<m1->cols; y++){ Matrix_set(c,i,j,Matrix_get(c,i,j) + Matrix_get(m1,i,y) * Matrix_get(m2,y,j)); } } } return(c); }
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; }
Matrix* Matrix_minor(Matrix *mat, int x, int y){ Matrix *temp = Matrix_clone(mat); Matrix *newmat = Matrix_create(temp->rows - 1, temp->cols - 1); int i,j; int n = temp->rows; int m = temp->cols; int cnt = 0; double *myArr = (double*)malloc((n - 1) * (m - 1) * sizeof(double)); for(i = 0; i < n; i++){ for(j = 0; j < m; j++){ if(i != x && j != y){ myArr[cnt] = Matrix_get(temp,i,j); cnt++; } } } cnt = 0; for(i = 0; i < n - 1; i++){ for(j = 0; j < m - 1; j++){ Matrix_set(newmat,i,j,myArr[cnt]); cnt++; } } return newmat; }
Matrix *Matrix_echelon(Matrix* m){ int cols=m->cols; int rows=m->rows; int i=0,j=0,k=0; Matrix *temp=Matrix_clone(m); double pivot; for (i=0;i<rows;i++){ for(j = i + 1;j<rows;j++){ pivot = -1*Matrix_get(temp,j,i) / Matrix_get(temp,i,i); for(k = 0; k < cols; k++){ Matrix_set(temp,j,k, Matrix_get(temp,i,k) * pivot + Matrix_get(temp,j,k)); } } } return(temp); }
double Matrix_determinant(Matrix *m){ Matrix *temp=Matrix_echelon(m); int i; double sum=1.0; for (i=0;i<m->rows;i++) { sum*=Matrix_get(temp,i,i); } return(sum); }
Matrix *Matrix_transpose(Matrix *m){ Matrix *newmatrix=Matrix_create(m->cols, m->rows); int i,j; for (i=0;i<m->rows;i++){ for (j=0;j<m->cols;j++){ Matrix_set(newmatrix,j,i,Matrix_get(m,i,j)); } } return(newmatrix); }
/***Matrix_delete***/ Token Matrix_delete(Token token, ...) { int i, j; Token element, emptyToken; // Delete each elements. for (i = 0; i < token.payload.Matrix->column; i++) { for (j = 0; j < token.payload.Matrix->row; j++) { element = Matrix_get(token, j, i); functionTable[(int) element.type][FUNC_delete](element); } } free(token.payload.Matrix->elements); free(token.payload.Matrix); return emptyToken; }
// make a new matrix from the given values // assume that number of the rest of the arguments == length, // and they are in the form of (element, element, ...). // The rest of the arguments should be of type Token *. Token Matrix_new(int row, int column, int given, ...) { va_list argp; int i; Token result; char elementType; result.type = TYPE_Matrix; result.payload.Matrix = (MatrixToken) malloc(sizeof(struct matrix)); result.payload.Matrix->row = row; result.payload.Matrix->column = column; // Allocate a new matrix of Tokens. if (row > 0 && column > 0) { // Allocate an new 2-D array of Tokens. result.payload.Matrix->elements = (Token*) calloc(row * column, sizeof(Token)); if (given > 0) { // Set the first element. va_start(argp, given); for (i = 0; i < given; i++) { result.payload.Matrix->elements[i] = va_arg(argp, Token); } // elementType is given as the last argument. elementType = va_arg(argp, int); if (elementType >= 0) { // convert the elements if needed. for (i = 0; i < given; i++) { if (Matrix_get(result, i, 0).type != elementType) { result.payload.Matrix->elements[i] = functionTable[(int)elementType][FUNC_convert](Matrix_get(result, i, 0)); } } } va_end(argp); }