-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
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.;
– Raphael de melo