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);
}
Exemple #8
0
/***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;
}
Exemple #9
0
// 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);
        }