Problem with passing parameters/return of function matrices in C

Asked

Viewed 122 times

-1

I’m having a problem with a job I have to do in C consisting of, get the inverse matrix through the adjunct matrix.

So far this is what I’ve been able to produce in C# and then tried to rewrite in C, but I’m not succeeding by not knowing the language.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int mult = 0;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
float detLaplace(int n, float a[n][n]);
float det2(float matriz[2][2]);
float det3(float matriz[3][3]);
float cofator(int n, float matriz[n][n], int L,int C);
float matCofator(int n, float a[n][n]);
float transposta(int n, float matriz[n][n]);
float adjunta (int n, float matriz[n][n]);
float inversa(int n, float matriz[n][n]);

//MAIN #TODO
int main(int argc, char *argv[]) {
    return 0;
}





/*
    |-------------------|
    |       FUNÇÕES     |
    |-------------------|
*/

//determinante de matrix com ordem > 3
float detLaplace(int n, float a[n][n]){

    if(n == 1){
        //Caso básico: matriz 1x1
        return a[0][0];
    }
    else{
        float det = 0;
        int i, row, col, j_aux, i_aux;

        //Escolhe a primeira linha para calcular os cofatores
        for(i = 0; i < n; i++){
            //ignora os zeros (zero vezes qualquer número é igual zero)
            if (a[0][i] != 0) {
                float aux[n - 1][n - 1];
                i_aux = 0;
                j_aux = 0;
                //Gera as matrizes para calcular os cofatores
                for(row = 1; row < n; row++){
                    for(col = 0; col < n; col++){
                        if(col != i){
                            aux[i_aux][j_aux] = a[row][col];
                            j_aux++;
                        }
                    }
                    i_aux++;
                    j_aux = 0;
                }
                float factor = (i % 2 == 0)? a[0][i] : -a[0][i];
                det = det + factor * detLaplace(n - 1, aux);
            }
        }
        return det;
    }
}

//determinante de matrix ordem 2
/*float det2(float matriz[2][2]){
    float det=0;

    det = matriz[0][0]*matriz[1][1]-(matriz[0][1]*matriz[1][0]);

    mult+=2;

    return det;
}

//determinante de matrix ordem 3
float det3(float matriz[3][3]) {
    float det=
            (matriz[0][0]*matriz[1][1]*matriz[2][2])+
            (matriz[0][1]*matriz[1][2]*matriz[2][0])+
            (matriz[0][2]*matriz[1][0]*matriz[2][1])-
            (matriz[2][0]*matriz[1][1]*matriz[0][2])-
            (matriz[2][1]*matriz[1][2]*matriz[0][0])-
            (matriz[2][2]*matriz[1][0]*matriz[0][1]);

    mult+=12;
    return det;
}*/

//Realiza o cofator da pozição na matriz https://mundoeducacao.bol.uol.com.br/matematica/calculando-cofator-uma-matriz.htm
float cofator(int n, float matriz[n][n], int L,int C){


    int ordMatAux=n-1;
    int lAux = 0;
    int cAux = 0;
    int i=0;
    int j=0;
    float matAux[ordMatAux][ordMatAux];
    float Cof =0;
    float determinate;





    //monta matriz auxiliar de ordem menor que a original
    for(i=0; i<n;i++){
        for(j=0; j<n;j++){

            if(i!=L || j!=C ){
                matAux[lAux][cAux] =matriz[i][j];   
                cAux++;
            }
        }
        lAux++;
        cAux = 0;
    }


    //realiza a determinante da matrix auxiliar
    determinante =  detLaplace(ordMatAux,matAux[ordMatAux][ordMatAux]);
    /*if(n-1==2){
        det = det2(matAux[2][2]);
    }
    else if(n-1==3){
        det = det3(matAux[3][3]);
    }

    else if(n-1>3){
        det = detLaplace(matAux[n][n]);

    }*/
    //retorna o cofator
    Cof=Pow(-1,L+C)*determinante;
    return Cof;
}

//gera a matriz com os cofatores da matriz
float * matCofator(int n, float a[n][n]){

    static float matAux[n][n];

    int contador = 0;
    int i;
    int j;

    //Esstrutura para percorrer os valores da matriz e obter o cofator
    for( i=0;i<n;i++){
        for( j=0;j<n;j++){

            //Verifica qual a ordem dos valores recebidos para modificar seu sinal 
            if(contador%2==0){
                matAux[i][j] = cofator(n,a[n][n],i,j); 
            }
            else if(contador%2!=0){
                matAux[i][j] = cofator(n,a[n][n],i,j)*(-1); 
            }

        }
    }

    //retorna a matrix dos cofatores já com a inversão de sinais https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWQrcWYyqWK9wUGoUS9bnaGn5iCmj6CD9016BF0jopfcg4Xsme
    return matAux;
}

//Tramponhe a matriz
float * transposta(int n, float matriz[n][n]){

    int L=0;
    int C=0;
    static float[n][n] matTramp;

    for(L< D,L++){
        for(C< D,C++){
            matTramp[C,L] = matriz[L,C];
        }
    }
    return matTramp;
}

float * adjunta (int n, float matriz[n][n]){
    static float matAux[n][n];

    matAux = matCofator(n,matriz[n][n]);

    //retorna matriz dos cofatores transposta
    matAux = transposta(n,matAux[n][n]);
    return matAux;
}

float * inversa(int n, float matriz[n][n]){
    static float matAux[n][n];
    float detPrincipal=0;
    int i;
    int j;

    if(n==2){
        detPrincipal = det2(matriz[n][n]);
    }
    else if(n==3){
        detPrincipal = det3(matriz[n][n]);      
    }
    else if(n>3){
        detPrincipal = detLaplace(matriz[n][n]);
    }   

    matAux = adjunta(n,matriz[n][n]);   

    for(i = 0, i<n,i++){
        for(j = 0, i<n,i++){
            matAux[n][n] = matAux[n][n]*(1/detPrincipal);
        }
    }

    return matAux;
}

These are the main mistakes I’m getting and I can’t fix: L125:[Error] incompatible type for argument 2 of 'detLaplace' L143:[Error] Conflicting types for 'matCofator'

edit1: Code updated but not yet able to pass matrix as parameter.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int mult = 0;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
float detLaplace(int n, float a[n][n]);
float det2(float matriz[2][2]);
float det3(float matriz[3][3]);
float * cofator(int n, float matriz[n][n], int L,int C);
float * matCofator(int n, float a[n][n]){
float * transposta(int n, float matriz[n][n]);
float * adjunta (int n, float matriz[n][n]);
float * inversa(int n, float matriz[n][n]);

//MAIN #TODO
int main(int argc, char *argv[]) {

    int l;
    int c;
    int o;

    printf("Insira a ordem da matriz: ");
    scanf("%d\n",&o);
    float matriz[o][o];

    for(l=0;l<o;l++){
        for(c=0;c<o;c++){
            printf("\nInsira valor da celula[%i][%i]: ",&l,&c);
            scanf("%d",&o);
        }
            printf("\n");
    }   
    return 0;
}





/*
    |-------------------|
    |       FUNÇÕES     |
    |-------------------|
*/

//determinante de matrix com ordem > 3
float detLaplace(int n, float a[n][n]){

    if(n == 1){
        //Caso básico: matriz 1x1
        return a[0][0];
    }
    else{
        float det = 0;
        int i, row, col, j_aux, i_aux;

        //Escolhe a primeira linha para calcular os cofatores
        for(i = 0; i < n; i++){
            //ignora os zeros (zero vezes qualquer número é igual zero)
            if (a[0][i] != 0) {
                float aux[n - 1][n - 1];
                i_aux = 0;
                j_aux = 0;
                //Gera as matrizes para calcular os cofatores
                for(row = 1; row < n; row++){
                    for(col = 0; col < n; col++){
                        if(col != i){
                            aux[i_aux][j_aux] = a[row][col];
                            j_aux++;
                        }
                    }
                    i_aux++;
                    j_aux = 0;
                }
                float factor = (i % 2 == 0)? a[0][i] : -a[0][i];
                det = det + factor * detLaplace(n - 1, aux);
            }
        }
        return det;
    }
}

//gera a matriz cofator
float * matCofator(int n, float a[n][n]){
    static float matCof[n][n];
    float aux[n - 1][n - 1];    
    float det = 0;
    int i, row, col, j_aux, i_aux;

    for(i = 0; i < n; i++){
        i_aux = 0;
        j_aux = 0;
            //Gera as matrizes para calcular os cofatores
        for(row = 1; row < n; row++){
            for(col = 0; col < n; col++){
                if(col != i){
                    aux[i_aux][j_aux] = a[row][col];
                    j_aux++;
                }
            }
            i_aux++;
            j_aux = 0;
        }
           float factor = (i % 2 == 0)? a[0][i] : -a[0][i];
           matCof[i][n] = factor * detLaplace(n - 1, aux);
    }
    //retorna a matrix dos cofatores já com a inversão de sinais https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWQrcWYyqWK9wUGoUS9bnaGn5iCmj6CD9016BF0jopfcg4Xsme
    return matCof;
}

//Tramponhe a matriz
float * transposta(int n, float matriz[n][n]){

    int L=0;
    int C=0;
    static float[n][n] matTramp;

    for(L< D,L++){
        for(C< D,C++){
            matTramp[C,L] = matriz[L,C];
        }
    }
    return matTramp;
}

float * adjunta (int n, float matriz[n][n]){
    static float matAux[n][n];
    matAux = matCofator(n,matriz[n][n]);

    //retorna matriz dos cofatores transposta
    matAux = transposta(n,matAux[n][n]);
    return matAux;
}

float * inversa(int n, float matriz[n][n]){
    static float matAux[n][n];
    float detPrincipal=0;
    int i;
    int j;

    detPrincipal = detLaplace(n, matriz[n][n]); 

    matAux = adjunta(n,matriz[n][n]);   

    for(i = 0, i<n,i++){
        for(j = 0, i<n,i++){
            matAux[n][n] = matAux[n][n]*(1/detPrincipal);
        }
    }

    return matAux;
}

If you can explain my mistakes and why they are happening, I am grateful >:D

1 answer

2

The problem of conflicting types for 'matCofator' is because of the erroneous statement of the function.

What you wrote was:

float matCofator(int n, float a[n][n]);

What you must want is

float * matCofator(int n, float a[n][n]);

Regarding the error of incompatible type for argument 2 of 'detLaplace' is because in the reverse function when it calls the detLaplace function you only put an argument, when the function needs 2.

else if(n>3){
    detPrincipal = detLaplace(matriz[n][n]); // <- ERROR
}
  • this helped me in parts but I don’t understand why to turn the function into pointer, even if I realize that I passed the same problem when I try to pass a matrix per parameter.;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.