Jump to content
Fórum Script Brasil
  • 0

Como extrair uma matriz complementar de uma matriz 3X3?


spdm
 Share

Question

Olá pessoal,

Estou começando a estudar C no meu curso(automação industrial), e me enrolei para fazer um dos exercícios pedidos.

Preciso extrair de uma matriz 3x3 sua matriz complementar. Tentei criar uma função para isso, mas não achei a lógica correta para faze-la funcionar corretamente.

Alguém poderia postar um exemplo?

Grato.

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Olá!

Agora não estou em um pc então não vou poder te ajudar quanto a um código de exemplo. Mas o cálculo da matriz complementar é basicamente a cópia dos elementos de uma matriz para outra, apenas eliminando a linha e coluna do elemento em questão.

Assim faça inicialmente um código de cópia de duas matrizes. Em seguida adicione uma lógica que não permita a cópia. Coloque aqui o que conseguir!

Abraços,

Marcelo Utikawa da Fonseca

Edited by Marcelo Utikawa da Fonseca
Link to comment
Share on other sites

  • 0

Valeu Marcelo por se dispor a ajudar.

"Pelejando" aqui, consegui resolver o problema(só não sei se fiz da melhor maneira). O exercício pede para calcular a determinante, a matriz de cofatores, a matriz adjunta, a matriz inversa e também para provar que a matriz realmente é inversa multiplicando-a pela matriz original.

Segue o código:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int cofatores(int l,int c, int m[3][3]);

int menorComplementar(int l,int c, int m[3][3]);

int laplace(int cofator1, int cofator2, int cofator3, int m[3][3]);

int main()

{

/*5) Crie um programa em C que leia uma matriz 3x3 de inteiros. O programa deve calcular e

mostrar:

a) O determinante da matriz

B) A matriz de cofatores dessa matriz

c) A matriz adjunta dessa matriz

d) A matriz inversa dessa matriz

Teste a matriz inversa multiplicando a matriz original pela inversa e verificando se o

resultado é a matriz identidade. (use os exercícios 4 e 1)*/

int matriz[3][3], matrizCof[3][3],matrizAdjunta[3][3],cont,cont2;

float matrizInversa[3][3],determinante,vetorLinha1[3],vetorLinha2[3],vetorLinha3[3];

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2 < 3; cont2++)

{

printf("\nDigite um valor para preencher a posicao [%d][%d] da matriz:",cont,cont2);

scanf("%d",&matriz[cont][cont2]);

}

}

determinante = laplace(cofatores(0,0,matriz),cofatores(0,1,matriz),cofatores(0,2,matriz),matriz);

printf("\n1 - O determinate da matriz digitada e: %.1f\n\n",determinante);

printf("2 - Matriz de cofatores:\n\n");

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2 < 3; cont2++)

{

matrizCof[cont][cont2] = cofatores(cont,cont2,matriz);

printf(" %d ",matrizCof[cont][cont2]);

if(cont2 == 2)

{

printf("\n");

}

}

if(cont == 2)

{

printf("\n");

}

}

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2 < 3; cont2++)

{

matrizAdjunta[cont2][cont] = matrizCof[cont][cont2];

}

}

printf("\n\n3 - Matriz Adjunta:\n\n");

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2 < 3; cont2++)

{

printf(" %d ",matrizAdjunta[cont][cont2]);

if(cont2 == 2)

{

printf("\n");

}

}

}

printf("\n\n4 - Matriz inversa:\n\n");

if(determinante != 0)

{

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2 < 3; cont2++)

{

matrizInversa[cont][cont2] = matrizAdjunta[cont][cont2] * (1/determinante);

}

}

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2 < 3; cont2++)

{

printf(" %f ",matrizInversa[cont][cont2]);

if(cont2 == 2)

{

printf("\n");

}

}

}

for(cont = 0;cont < 3; cont++)

{

vetorLinha1[cont] = 0;

vetorLinha2[cont] = 0;

vetorLinha3[cont] = 0;

}

for(cont =0;cont < 3; cont++)

{

for(cont2= 0;cont2<3;cont2++)

{

if(cont == 0)

{

vetorLinha1[cont] += (matriz[cont][cont2] * matrizInversa[cont2][cont]);

}

if(cont == 1)

{

vetorLinha2[cont] += (matriz[cont][cont2] * matrizInversa[cont2][cont]);

}

if(cont == 2)

{

vetorLinha3[cont] += (matriz[cont][cont2] * matrizInversa[cont2][cont]);

}

}

}

printf("\n5 - Multiplicacao da matriz inserida pelo usuario pela sua inversa:\n\n");

for(cont=0;cont < 3; cont++)

{

printf(" %.1f ",vetorLinha1[cont]);

}

printf("\n");

for(cont=0;cont < 3; cont++)

{

printf(" %.1f ",vetorLinha2[cont]);

}

printf("\n");

for(cont=0;cont < 3; cont++)

{

printf(" %.1f ",vetorLinha3[cont]);

}

}

else

{

printf("\n\n - não foi possivel encontar a matriz inversa(determinante igual a 0)\n");

}

return 0;

}

int cofatores(int l,int c,int m[3][3])

{

int cont,cont2,cofator, flag=0;

for(cont=0;cont<3;cont++)

{

for(cont2=0;cont2<3;cont2++)

{

if(l == cont && c == cont2 )

{

cofator = pow(-1,cont+cont2) * menorComplementar(l,c,m);

flag = 1;

}

else

{

flag = 0;

}

if(flag == 1)

{

break;

}

}

if(flag == 1)

{

break;

}

}

return cofator;

}

int menorComplementar(int l,int c,int m[3][3])

{

int cont,cont2,cont3,cont4,cont5, cont6, cont7, cont8, cont9, cont10, det,n[2][2];

int contador = 0;

for(cont = 0; cont < 3; cont++)

{

for(cont2 = 0; cont2<3; cont2++)

{

if(cont != l && cont2 != c)

{

contador = contador + 1;

if (contador == 1)

{

cont3 = cont;

cont4 = cont2;

}

if (contador == 2)

{

cont5 = cont;

cont6 = cont2;

}

if (contador == 3)

{

cont7 = cont;

cont8 = cont2;

}

if (contador == 4)

{

cont9 = cont;

cont10 = cont2;

}

}

}

}

n[0][0]= m[cont3][cont4];

n[0][1]= m[cont5][cont6];

n[1][0]= m[cont7][cont8];

n[1][1]= m[cont9][cont10];

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

return det;

}

int laplace(int cofator1, int cofator2, int cofator3,int m[3][3])

{

int cont, cont2, det=0,flag =0;

for(cont =0; cont < 3; cont++)

{

for(cont2 = 0; cont2 <3;cont2++)

{

if(cont == 0 && cont2 == 0)

{

det = cofator1 * m[cont][cont2];

}

if(cont == 0 && cont2 == 1)

{

det += (cofator2 * m[cont][cont2]);

}

if(cont == 0 && cont2 == 2)

{

det += (cofator3 * m[cont][cont2]);

flag = 1;

}

}

if(flag == 1)

{

break;

}

}

return det;

}

Desculpe ai galera, o código perdeu a indentação depois que eu postei e ficou meio confuso.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.5k
×
×
  • Create New...