Sei sulla pagina 1di 14

Operaciones con matrices en C++.

Universidad Autonoma del Estado de Hidalgo


Maestra en Ciencias en Automatizacion y Control.

Leopoldo Vite Hernandez 243516


04 de septiembre del 2015
Resumen
El concepto de matriz alcanza m
ultiples aplicaciones tanto en la representaci
on y manipulaci
on de datos como
en el c
alculo numerico y simb
olico que se deriva de los modelos matem
aticos utilizados para resolver problemas
en diferentes disciplinas como, por ejemplo, las ciencias sociales, las ingenieras, economa, fsica, estadstica y las
diferentes ramas de las matem
aticas entre las que destacamos las ecuaciones diferenciales, el c
alculo numerico y,
por supuesto, el
algebra.
En este documento se analizan las principales operaciones matriciales y algunas de sus propiedades. La programaci
on de las operaciones se realiza en subprogramas, finalmente, el c
odigo se integra para obtener la inversa
de una matriz nxn utilizando funciones con el fin de obtener un c
odigo m
as entendible.

1.

Definici
on

Una matriz A de mxn es un arreglo rectangular de mn n


umeros dispuestos en m renglones y n
columnas

a11 a12 a1j a1n


a21 a22 a2j a2n

..
..
..
..
.
.
.
.

A=
(1)
ai1 ai2 aij ain

.
..
..
..
..
.
.
.
am1 am2 amj amn

a1j
a2j

El vector renglon [ai1 , ai2 , . . . ain ] se llama renglon i y el vector columna . se llama columna j. La
..
amj
componente o elemento ij de A, denotado por aij , es el elemento que aparece en el renglon i y la columna
j de A.[1]

2.
2.1.

Operaciones Matriciales
Suma y resta de matrices

Sean A = (aij ) y B = (bij ) dos matrices mxn. Entonces la suma de A y B es la matriz mxn, A + B
dada por

a11 + b11
a12 + b12 a1n + b1n
a21 + b21
a22 + b22 a2n + b2n

A + B = (aij + bij ) =

..
..
..

.
.
.
am1 + bm1
1

am2 + bm2

amn + bmn

2 Operaciones Matriciales

Es decir, A + B es la matriz mxn que se obtiene al sumar las componentes correspondientes de A y B.


En forma parecida, la resta, A B, se obtiene restando las entradas correspondientes.

a11 b11
a12 b12 a1n b1n
a21 b21
a22 b22 a2n b2n

A B = (aij bij ) =

..
..
..

.
.
.
am1 bm1

am2 bm2

amn bmn

La suma y resta de matrices se definen u


nicamente cuando las matrices son del mismo tama
no.
2.1.1.

Codificaci
on en C++: Suma

#include <iostream.h>
#include <conio.h>
int f,c,n,m;
main()
{
int a[10][10],b[10][10],d[10][10];
cout<<"\n\tM. en C. en Automatizacion y control";
cout<<"\n\tSimulacion y Programacion\n\n\t";
cout<<"Suma de matrices A nxm + B nxm\n\t";
cout<<"\nNumero de filas n de la matriz A y B : ";
cin>>n;
cout<<"\nNumero de columnas m de la matriz A y B : ";
cin>>m;
//introduce matriz a
cout<<"\n\n\tCapture la Matriz A";
for(f=0;f<n;f=f+1)
{
cout<<"\n";
for(c=0;c<m;c=c+1)
{
cout<<"\n\tIngrese elemento A["<<f<<"]["<<c<<"]: ";
cin>>a[f][c];
}
}
//getch(); //Enter para proseguir
//clrscr();
//introduce matriz b
cout<<"\n\n\tCapture la Matriz B";
for(f=0;f<n;f=f+1)
{
cout<<"\n";
for(c=0;c<m;c=c+1)
{
cout<<"\n\tIngrese elemento B["<<f<<"]["<<c<<"]: ";
cin>>b[f][c];
}
}
getch();
//Realiza la suma
for(f=0;f<n;f=f+1)
{
for(c=0;c<m;c=c+1)
{

2 Operaciones Matriciales

d[f][c]=a[f][c]+b[f][c];
}
}
cout<<"\n\n\tResultado: Mat A + Mat B:\n\n";
//imprime matriz d
for(f=0;f<n;f=f+1)
{
cout<<"\n";
for(c=0;c<m;c=c+1)
{
cout<<"\t\t"<<d[f][c];
}
}
getch();
}

Fig. 1: Suma de matrices nxm.

2.1.2.

Codificaci
on en C++: Resta

#include <iostream.h>
#include <conio.h>
int f,c,n,m;
main()
{
int a[10][10],b[10][10],d[10][10];
cout<<"\n\tM. en C. en Automatizacion y control";
cout<<"\n\tSimulacion y Programacion\n\n\t";

2 Operaciones Matriciales

cout<<"Resta de matrices A nxm + B nxm\n\t";


cout<<"\nNumero de filas n de la matriz A y B : ";
cin>>n;
cout<<"\nNumero de columnas m de la matriz A y B : ";
cin>>m;
//introduce matriz a
cout<<"\n\n\tCapture la Matriz A";
for(f=0;f<n;f=f+1)
{
cout<<"\n";
for(c=0;c<m;c=c+1)
{
cout<<"\n\tIngrese elemento A["<<f<<"]["<<c<<"]: ";
cin>>a[f][c];
}
}
//getch(); //Enter para proseguir
//clrscr();
//introduce matriz b
cout<<"\n\n\tCapture la Matriz B";
for(f=0;f<n;f=f+1)
{
cout<<"\n";
for(c=0;c<m;c=c+1)
{
cout<<"\n\tIngrese elemento B["<<f<<"]["<<c<<"]: ";
cin>>b[f][c];
}
}
getch();
//Realiza la resta
for(f=0;f<n;f=f+1)
{
for(c=0;c<m;c=c+1)
{
d[f][c]=a[f][c]-b[f][c];
}
}
cout<<"\n\n\tResultado: Mat A - Mat B:\n\n";
//imprime matriz d
for(f=0;f<n;f=f+1)
{
cout<<"\n";
for(c=0;c<m;c=c+1)
{
cout<<"\t\t"<<d[f][c];
}
}
getch();
}

2 Operaciones Matriciales

Fig. 2: Resta de matrices nxm.

2.2.

Multiplicaci
on por un escalar

Si A = (aij ) es una matriz de mxn y es un escalar, la multiplicacion A se obtiene multiplicando


por cada entrada de A: (A)ij = (Aij ).
2.2.1.

Codificaci
on en C++

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
main()
{
int a[3][3],d[3][3];
int f,c,n,x;
cout<<"\n\tM. en C. Automatizacion y control\n\n\n\t";
cout<<"Multiplicacion de una matriz nxn por un escalar\n\t";
cout<<"\n\nDimension nxn de la matriz A: ";
cin>>n;
for(f=0;f<n;f=f+1)
{
for(c=0;c<n;c=c+1)
{
cout<<"\n\tIngrese elemento a["<<f<<"]<<["<<c<<"]: ";
cin>>a[f][c];
}
}
cout<<"\n\nIngrese el escalar alfa: ";
cin>>x;
getch();
//realiza la multiplicacion
for(f=0;f<n;f=f+1)
{
for(c=0;c<n;c=c+1)

2 Operaciones Matriciales

{
d[f][c]=a[f][c]*x;
}
}
cout<<"\n\n\tRESULTADO:";
//imprime matriz d
for(f=0;f<n;f=f+1)
{
cout<<"\n\n\n";
for(c=0;c<n;c=c+1)
{
cout<<"\t\t\t"<<d[f][c];
}
}
getch();
}

Fig. 3: Multiplicacion de un escalar por una matriz.

2.3.

Producto entre matrices

Sea A = (a)ij una matriz mxn, y sea B = (b)ij una matriz nxp. Entonces el producto de A y B es
una matriz mxp, C = (cij ), donde
cij = (renglon i de A) (columna j de B)
Es decir, el elemento ij de AB es el producto del renglon i de A y la columna j de B.
Si el n
umero de columnas de A es igual al n
umero de renglones de B, entonces se dice que A y B son
compatibles bajo la multiplicaci
on.
2.3.1.

Codificaci
on en C++

#include <iostream.h>
#include <conio.h>
main()
{
int a[3][3],b[3][3],d[3][3];
int f,c,k,n;

2 Operaciones Matriciales

cout<<"\n\tM. en C. Automatizacion y control\n\n\n\t";


cout<<"Multiplicacion de matrices nxn\n\t";
cout<<"\nDimension n de la matriz A y B : ";
cin>>n;
//introduce matriz a
cout<<"\nMatriz A: \n\n";
for(f=0;f<n;f=f+1)
{
for(c=0;c<n;c=c+1)
{
cout<<"\n\tIngrese elemento ["<<f<<"]["<<c<<"]: ";
cin>>a[f][c];
}
}
getch();
//introduce matriz b
cout<<"\nMatriz B: \n\n";
for(f=0;f<n;f=f+1)
{
for(c=0;c<n;c=c+1)
{
cout<<"\n\tIngrese elemento ["<<f<<"]["<<c<<"]: ";
cin>>b[f][c];
}
}
getch();
//realiza la multiplicacion
for(f=0;f<n;f=f+1)
{
for(c=0;c<n;c=c+1)
{
d[f][c]=0;
for(k=0;k<n;k++)
{
d[f][c]=(d[f][c]+a[f][k]*b[k][c]);
}
}
}
cout<<"\n\n\tRESULTADO [A]*[B]:";
//imprime matriz d
for(f=0;f<n;f=f+1)
{
cout<<"\n\n\n";
for(c=0;c<n;c=c+1)
{
cout<<"\t"<<d[f][c];
}
}
getch();
}

2 Operaciones Matriciales

Fig. 4: Multiplicacion de matrices nxn.

2.4.

Determinante de una matriz nxn

Sea A una matriz nxn. Entonces el determinante de A, denotado por det A o |A|, esta dado por
det A = |A| = a11 A11 + a12 A12 + a13 A13 + + a1n A1n =

a1k A1k

k=1

La expresion anterior se llama expansion por cofactores.


El determinante de una matriz determina si los sistemas son singulares o mal condicionados. En otras
palabras, determina la existencia y la unicidad de los resultados de los sistemas de ecuaciones lineales.
Algunas caractersticas son las siguientes:
a) El determinante de una matriz es un escalar.
a) Un determinante con valor de cero indica que se tiene un sistema singular.
2.4.1.

Codificaci
on en C++

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
int determinante(int a[][100],int orden);//prototipo de funcion
main()
{
cout<<"\n\tM. en C. en Automatizacion y control";
cout<<"\n\tSimulacion y Programacion\n\n\t";
int n;
int mat[100][100];
srand(time(NULL));
cout<<"\nIngrese el orden de la matriz A: ";cin>>n;
for(int j=0;j<n;j++)
{

2 Operaciones Matriciales

for(int i=0;i<n;i++)
{
cout<<"\n\tIngrese el elemento ["<<j<<"]["<<i<<"]: ";
cin>>mat[i][j];
}
}
getch();
cout<<"\nLa matriz ingresada es:"<<endl;
for(int j=0;j<n;j++)
{for(int i=0;i<n;i++)
cout<<mat[i][j]<<" ";
cout<<endl;
}
cout<<"\n\tEl determinante es: "<<determinante(mat,n)<<endl;
system("pause");
}
int determinante(int a[][100],int orden)
{
int det=0;
int aux1[100][100];
int aux2[100][100];

if(orden==1)
return a[0][0];
for(int i=0;i<orden;i++)
{
if(i%2==0)
{for(int y=0;y<orden;y++)
for(int x=0;x<orden;x++)
if(x<i)
aux1[x][y]=a[x][y+1];
else
aux1[x][y]=a[x+1][y+1];
det=det+a[i][0]*determinante(aux1,orden-1);
}
else
{for(int y=0;y<orden;y++)
for(int x=0;x<orden;x++)
if(x<i)
aux2[x][y]=a[x][y+1];
else
aux2[x][y]=a[x+1][y+1];
det=det-a[i][0]*determinante(aux2,orden-1);
}
}
return det;
}

2 Operaciones Matriciales

10

Fig. 5: Determinante de una matriz nxn.

2.5.

Matriz de cofactores

Sea A una matriz de nxn. El cofactor ij de A, denotado por Aij esta dado por
Aij = (1)i+j | Mij |
Esto es, el cofactor ij de A se obtiene tomando el determinante del menor ij y multiplicandolo por
(1)i+j . Observe que
{
1,
si i + j es par
(1)i+j =
1, si i + j es impar

2.6.

Adjunta de una matriz

Antes de utilizar determinantes para calcular las inversas, es necesario definir la adjunta de una matriz
A = (aij ). Sea B = (Aij ) la matriz de cofactores de A, entonces

A11 A12 A1n


A21 A22 A2n

B= .
(2)
..
..
..
.
.
An1

An2

Ann

La adjunta
Sea A una matriz de nxn y sea B, dada por (2), la matriz de sus cofactores. Entonces, la adjunta de A,
escrito adj A, es la transpuesta de la matriz B de nxn; es decir,

A11 A21 An1


A12 A22 An2

adj A = B T = .
..
.. .
..
.
.
A1n A2n Ann

2.7.

Inversa de una Matriz

Sean A y B dos matrices de nxn. Suponga que


AB = BA = I
Entonces B se llama la inversa de A y se denota por A1 . Entonces se tiene
AA1 = A1 A = I

2 Operaciones Matriciales

11

Si A tiene inversa, entonces se dice que A es invertible. Una matriz cuadrada que no es invertible se le
denomina singular y un matriz que es invertible se le llama no singular.
Observaci
on I. A partir de esta definicion se deduce que (A1 )1 = A si A es invertible.
Observaci
on II. Esta definicion no establece que toda matriz cuadrada tiene inversa.
Teorema
Sea A una matriz de nxn. Entonces A es invertible si y solo si det A = 0. Si det A = 0, entonces
A1 =

1
adj A
det A

A continuaci
on se presenta el codigo programado en c++ para obtener la inversa de una matriz nxn.
Para ello se ha codificado el determinante, la matriz de cofactores, la matriz adjunta y finalmente la
inversa de la matriz.
2.7.1.

Codificaci
on en C++

#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
float determinante(float[25][25],float);
void cofactor(float[25][25],float);
void transpuesta(float[25][25],float[25][25],float);
int main()
{
float a[25][25],k,d;
int i,j;
cout<<"\n\tM. en C. en Automatizacion y
control";
cout<<"\n\tSimulacion y Programacion\n\n\t";
printf("\n Inversa de una Matriz nxn\n\n");
printf("Ingrese el orden de la Matriz : ");
scanf("%f",&k);
for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
cout<<"\n\tIngrese el elemento ["<<i<<"]["<<j<<"]: ";
cin>>a[i][j];
}
}
d=determinante(a,k);
printf("\n\nDeterminante de la matriz = %f",d);
if (d==0)
printf("\nLa matriz es singular (No posee inversa)e\n");
else
cofactor(a,k);
getch();
}
Funci
on para el c
alculo del determinante.

float determinante(float a[25][25],float k)


{
float s=1,det=0,b[25][25];
int i,j,m,n,c;

2 Operaciones Matriciales

if (k==1)
{
return (a[0][0]);
}
else
{
det=0;
for (c=0;c<k;c++)
{
m=0;
n=0;
for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
b[i][j]=0;
if (i != 0 && j != c)
{
b[m][n]=a[i][j];
if (n<(k-2))
n++;
else
{
n=0;
m++;
}
}
}
}
det=det + s * (a[0][c] * determinante(b,k-1));
s=-1 * s;
}
}
return (det);
}
Funci
on para el c
alculo del cofactor de la matriz.
void cofactor(float num[25][25],float f)
{
float b[25][25],fac[25][25];
int p,q,m,n,i,j;
for (q=0;q<f;q++)
{
for (p=0;p<f;p++)
{
m=0;
n=0;
for (i=0;i<f;i++)
{
for (j=0;j<f;j++)
{
if (i != q && j != p)
{
b[m][n]=num[i][j];

12

2 Operaciones Matriciales

if (n<(f-2))
n++;
else
{
n=0;
m++;
}
}
}
}
fac[q][p]=pow(-1,q + p) * determinante(b,f-1);
}
}
transpuesta(num,fac,f);
}
//Transpuesta
Funci
on para el c
alculo de la transpuesta de la matriz de cofactores (Matriz Adjunta).
void transpuesta(float num[25][25],float fac[25][25],float r)
{
int i,j;
float b[25][25],inversa[25][25],d;
for (i=0;i<r;i++)
{
for (j=0;j<r;j++)
{
b[i][j]=fac[j][i];
}
}
d=determinante(num,r);
for (i=0;i<r;i++)
{
for (j=0;j<r;j++)
{
inversa[i][j]=b[i][j] / d;
}
}
Muestra la matriz inversa resultante.

printf("\n\n\nLa inversa de la matriz es : \n\n");


for (i=0;i<r;i++)
{
for (j=0;j<r;j++)
{
printf("\t%f",inversa[i][j]);
}
printf("\n");
}
}

13

2 Operaciones Matriciales

14

Fig. 6: Calculo de la inversa de una matriz.

Comprobacion de la inversa de la matriz A en matlab:

Fig. 7: Inversa de una matriz en matlab.

La inversa resultante con el codigo programado en c++ es identica al resultado entregado en matlab,
con lo cual se comprueba el correcto funcionamiento del programa codificado.

Referencias

[1] Stanley, I. G., Algebra


lineal, McGraw-Hill, 2008

Potrebbero piacerti anche