Ir para conteúdo
Fórum Script Brasil
  • 0

Como extrair uma matriz complementar de uma matriz 3X3?


spdm

Pergunta

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 para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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

Editado por Marcelo Utikawa da Fonseca
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...