You are on page 1of 5

/* ============================================================

Biblioteca de funes matriciais


Prof. Afonso de Paula dos Santos
Engenharia de Agrimensura e Cartogrfica
Universidade Federal de Viosa
Fevereiro de 2012
============================================================ */
#define max 100
#include <stdio.h>

// -------------------------------------------------------------// Mostrar Matriz


// -------------------------------------------------------------m_mostra(m,nl,nc)
float m[max][max];
int nl,nc;
{
int i,j;
printf("\n\n");
for(i=0; i < nl; i++)
for(j=0; j < nc; j++)
{
printf("%.3f",m[i][j]);
}
printf("\n");
}

// -------------------------------------------------------------// Zerar Matriz


// -------------------------------------------------------------m_zero(m,nl,nc)
float m[max][max];
int nl,nc;
{
int i,j;
for(i=0; i < nl ; i++)
for(j=0; j < nc ; j++)
m[i][j] = 0.0;
}
// -------------------------------------------------------------// Cria Matriz Identidade
// -------------------------------------------------------------m_identidade(m,nl,nc)
float m[max][max];
int nl,nc;
{
int i,j;

for(i=0; i
for(j=0;
if(i
else

< nl ; i++)
j < nc ; j++)
!= j) m[i][j] = 0.0;
m[i][j] = 1.0;

}
// -------------------------------------------------------------// Transpor Matriz
// -------------------------------------------------------------m_transposta(m,nl,nc,mt)
float m[max][max], mt[max][max];
int nl,nc;
{
int i,j;
for(i=0; i < nl ; i++)
for(j=0; j < nc ; j++)
mt[j][i] = m[i][j];
}
// -------------------------------------------------------------// Soma Matriz
// -------------------------------------------------------------m_soma(m1,m2,nl,nc,m3)
float m1[max][max],m2[max][max],m3[max][max];
int nl,nc;
{
int i,j;
for(i=0; i < nl; i++)
for(j=0; j < nc; j++)
m3[i][j] = m1[i][j]+ m2[i][j];
}
// -------------------------------------------------------------// Subtrai Matriz
// -------------------------------------------------------------m_subtracao(m1,m2,nl,nc,m3)
float m1[max][max],m2[max][max],m3[max][max];
int nl,nc;
{
int i,j;
for(i=0; i < nl; i++)
for(j=0; j < nc; j++)
m3[i][j] = m1[i][j] - m2[i][j];
}
// -------------------------------------------------------------// Multipicla Matriz
// -------------------------------------------------------------m_multi(m1,m2,nl,nc1,nc2,m3) /*multiplica matrizes m1[nl][nc1] and m2[nc1][nc2]*
/

float m1[max][max],m2[max][max],m3[max][max];
int nl,nc1,nc2;
{
int i,j,k;
float sum;
sum = 0;
m_zero(m3,nl,nc2);
for(i=0; i < nl; i++)
{
for(j=0; j < nc2; j++)
{
for(k=0; k < nc1; k++)
{
sum = sum + m1[i][k]*m2[k][j];
}
m3[i][j] = sum;
sum = 0;
}
}
}
// -------------------------------------------------------------// Inverte Matriz 01
// -------------------------------------------------------------/*This function is used to calculate inverse matrix of m[][]*/
/*The method is to divide original matrix into Lower and Upper matrices respecti
vely*/
/*from the theorem: A=LU -> Inver(A)=inver(U)inver(L)*/
/*Hence, based on the theorem, the matrix A must be a square.(n = c)*/
inverse(z,nl,nc,item)
float z[max][max],item[max][max];
int nl,nc;
{
int i,j,k,p,q,r,s;
float l[max][max],u[max][max];
float append,determ,sum;
float il[max][max],iu[max][max];/*il[][] and iu[][] is the inverse matrix of l
[][] and u[][]*/
for(i=0; i < nl; i++)/*setup the elements of u[][] and l[][]*/
for(j=0; j < nc; j++)
{
if(j < i)/*lower triangle elements = 0*/
u[i][j] = 0;
else
{
u[i][j] = z[i][j];
for(k=0; k < i ; k++)
u[i][j] = u[i][j] - l[i][k]*u[k][j];
}
if(j < i)
l[j][i] = 0;/*upper triangle elements = 0*/
else if(j == i)/*diagonal elements = 1*/
l[j][i] = 1;

else
{
l[j][i] = z[j][i];
for(k=0 ; k < i ; k++)
l[j][i] = l[j][i] - l[j][k]*u[k][i];
l[j][i] = l[j][i]/u[i][i];
}
}
/*next to calculate the inverse of u[][] and l[][]*/
for(i=0 ; i < nl; i++)
for(j=0; j < nc; j++)
{
il[i][j] = 0;
iu[i][j] = 0;
}
for(i=0; i < nl; i++)/*setup inverse matrices diagonal elements*/
{
il[i][i] = 1;
if(u[i][i] != 0)
iu[i][i] = 1/u[i][i];
else
iu[i][i] = 0;
}
for(i=0; i < nc-1; i++)/*setup L matrix rest elements*/
{
for(j=i+1; j < nl; j++)
{
il[j][i] = -l[j][i];
for(k=i+1;k < j;k++)
{
il[j][i] = il[j][i] - l[j][k]*il[k][i];
}
}
}/*L matrix end setup*/
for(i=0; i < nl; i++)/*setup U matrix rest elements*/
{
for(j=i+1; j < nc; j++)
{
iu[i][j] = 0;
for(k=i;k < j;k++)
{
iu[i][j] = iu[i][j] - iu[i][k]*u[k][j];
}
if(u[j][j] != 0)
iu[i][j] = iu[i][j]/u[j][j];
}
}/*U matrix end setup*/

/*next calculate the inverse of matrix A where A=LU,A(-1)=U(-1)L(-1)*/


sum = 0;
for(i=0; i < nl; i++)
{

for(j=0; j < nc; j++)


{
for(k=0; k < nl; k++)
{
sum = sum + iu[i][k]*il[k][j];
}
item[i][j] = sum;
sum = 0;
}
}
}/*end of inverse()*/
// --------------------------------------------------------------------

main()
{
int op;
{
printf("\n
printf("\n
printf("\n
printf("\n
printf("\n

MENU
0.
1.
2.
3.

Exit");
create_P");
addmatrix");
Circulo \n\n

\n");

OPCAO: ");

do
{
scanf("%d", &op);
} while ((op < 0) || (op > 3));
switch (op)
{
case 1: printf("\n Quadrado...."
);
break;
case 2: printf("\n Retangulo....
");
break;
case 3: printf("\n Circulo....")
;
break;
default: exit(0);
} /* end switch */
}/*end for infinito*/
} /*end main*/

You might also like