Вы находитесь на странице: 1из 19

Captulo 12

Matrices o arreglos bidimensionales


12.1. Conceptos y notaci on
Una matriz es un arreglo rectangular de objetos, los cuales generalmente son n umeros,
caracteres, valores booleanos, y cualesquiera otro tipo de elementos que pertenecen a un
mismo conjunto.
Ejemplo. La siguiente estructura rectangular de n umeros enteros denotada por la expre-
si on X es una matriz
X =

1 3 7 2 8
9 11 5 6 4
6 2 1 1 1

En general, una matriz X se puede representar de la siguiente manera


X =

x
11
x
12
x
13
x
1(m1)
x
1m
x
21
x
22
x
23
x
2(m1)
x
2m

x
(n1)1
x
(n1)2
x
(n1)3
x
(n1)(m1)
x
(n1)m
x
n1
x
n2
x
n3
x
n(m1)
x
nm

donde la matriz esta compuesta por n las y m columnas, a esta matriz se le dice que es
de tama no n m.
X =

x
11
x
12
x
1m
x
21
x
22
x
2m

x
n1
x
n2
x
nm

n
m
187
188 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


Ejemplo. La siguiente matriz es una matriz de tama no 4 5
X =

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

A los objetos de la matriz se les llaman componentes o entradas de la matriz, y para


referirse a una componente en particular, a esta se le dice que es la componente en la
posicion (i, j}, esto signica que el objeto es la componente ubicada en la la i y en el
columna j, se denota por la expresi on X
ij
y se puede ubicar dentro de la matriz como se
muestra a continuaci on

x
11
x
1j
x
1m

x
i1
x
ij
x
im

x
n1
x
nj
x
nm

la i
columna j
Ejemplo. Para la matriz
X =

2 1
3
4
0.25 e

1
5

2 4 0.0 6
3.14
1
2

3 3
3

5 10 0 5 0.9

de tama no 4 5 se tiene que sus componentes son:


X
11
= 2.
X
12
= 1.
X
13
=
3
4
.
X
14
= 0.25.
X
15
= e.
X
21
=
1
5
.
X
22
=

2.
X
23
= 4.
X
24
= 0.0.
X
25
= 6.
X
31
= 3.14.
X
32
= .
X
33
=
1
2
.
X
34
=

3.
X
35
= 3.
X
41
=
3

5.
X
42
= 10.
X
43
= 0.
X
44
= 5.
X
45
= 0.9.
Cuando en una matriz se tiene que el n umero de las es igual al n umero de columnas
se dice que la matriz es cuadrada.
Ejemplo. La siguiente matriz de tama no 2 2, es una matriz cuadrada cuyas entradas
son valores del conjunto booleano (B)
12.2. DEFINICIONES ALTERNATIVAS 189
X = _
V F
F V
_
Ejemplo. La siguiente matriz de tama no 4 4, es una matriz cuadrada cuyas entradas
son n umeros reales, se le conoce como la matriz identidad de tama no 44 y se denota por
la expresion I
4
I
4
=

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

12.2. Deniciones alternativas


Una forma de entender la estructura interna de una matriz distinta a la denida pre-
viamente, es la de interpretarla como un arreglo de arreglos, esto es, verla como un arreglo
cuyas componentes son a su vez otros arreglos; como se explica a continuaci on:
i) Denici on de matrices por vectores la
Una matriz puede verse como un vector columna cuyas componentes son vectores
la, as una matriz es un vector de tama no n 1 cuyas componentes son vectores de
tama no 1 m.

x
11
x
12
x
1m

x
i1
x
i2
x
im

x
n1
x
n2
x
nm

n
m
=

x
11
x
12
x
1m

x
i1
x
i2
x
im

x
n1
x
n2
x
nm

n
1
ii) Denici on de matrices por vectores columna
Una matriz puede verse como un vector la cuyas componentes son vectores columna,
as una matriz es un vector de tama no 1 m cuyas componentes son vectores de
tama no n 1.

x
11
x
1j
x
1m
x
21
x
2j
x
2m

x
n1
x
nj
x
nm

n
m
=

x
11
x
21

x
n1

x
1j
x
2j

x
nj

x
1m
x
2m

x
nm

1
m
190 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


12.2.1. El conjunto de las matrices
En el captulo 10 sobre arreglos, se deni o un arreglo a partir del producto generalizado
de un conjunto T. El conjunto de los arreglos T

se deni o como la uni on de todos los


productos cartesianos del conjunto T, de la siguiente manera
T

=
mN
T
m
A partir del concepto de arreglo y usando la denicion i) de matrices por vectores la se
puede ahora denir el conjunto de las matrices T

como la uni on de todos los productos


cartesianos del conjunto de los arreglos del conjunto T, de la siguiente manera
T

=
nN
_

mN
T
m
_
n
El producto externo debe entenderse como un producto cartesiano que genera vectores
columna y que internamente genera vectores la, as como en la denici on i).
Un elemento generico del conjunto T

es de la forma (T
m
}
n
, donde n es el n umero
de las y m es el n umero de columnas. Para abreviar, de aqu en adelante se utilizar a la
notaci on
(T
m
}
n
T
nm
.
12.3. Las matrices en computaci on
Dado un conjunto de tipo de datos T, a partir de la denici on del conjunto de matrices
se dene el conjunto de las matrices o vectores bidimensionales T

del tipo de datos T.


As, el conjunto de las matrices del tipo de datos T es una coleccion de variables del tipo
de datos T que est an doblemente subindicadas, esto es, que se accede a ellas por medio
de un par de indices que especican una componente particular en una matriz, para esto
es necesario saber el n umero de su la (primer subndice) y el de su columna (segundo
subndice).
Cuando se dene una matriz de tama no n m en C++ o en Java, es necesario tener
en cuenta que la primera componente de la matriz est a ubicada en la posici on (0, 0} y la
ultima componente estara ubicada en la posici on (n 1, m 1}, analogamente a lo que
ocurra con los arreglos en C++ o en Java.
A partir de lo anterior, dada una matriz X T

, para acceder a la variable almacenada


en la componente (i, j} se utiliza la equivalencia
X
ij
X[i-1][j-1]
Cuando se dene una matriz de tama no nm en SciLab o en MatLab, la primera compo-
nente de la matriz esta ubicada en la posicion (1, 1} y la ultima componente estar a ubicada
12.3. LAS MATRICES EN COMPUTACI

ON 191
en la posicion (n, m}, similar a como se manejan las posiciones en notacion matematica
de matrices, es decir, para acceder en SciLab o MatLab a la variable almacenada en la
componente(i, j} se utiliza la equivalencia
X
ij
X[i][j]
12.3.1. Funciones para utilizar matrices
12.3.1.1. Creaci on de matrices
Matem aticamente se denira una rutina para la creacion de una matriz de tipo de datos
T como aquella rutina que dado un n N, que representa el n umero de componentes del
arreglo columna, y m N que correspondiente al tama no del cada arreglo la, retornar a una
matriz de T

de la siguiente manera
crear matriz T N N T

(n, m} X, donde X T
nm
T

En C++ se traduce
T** crear_matriz_T(int n, int m){
T** X = new T*[n]; // define un arreglo columna de n componentes
for(int i = 0; i < n; i++){
X[i] = new T[m]; // crea y asigna cada arreglo fila de tama~ no m
};
return X;
};




1
m
192 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES

2
m




n 2

n 1
m

n
m
Ejemplo. Para crear una matriz de tipo entero se tiene la siguiente funci on
int** crear_matriz_int(int n, int m){
int** X = new int*[n];
for(int i = 0; i < n; i++){
X[i] = new int[m];
};
return X;
};
12.3.1.2. Eliminacion de matrices
Para eliminar una matriz, as como en el caso de los arreglos, se debe entender que lo
que ocurre es que la porci on del espacio de la memoria que se utiliza para almacenar los
arreglos la de la matriz se regresan al sistema operativo para que este disponga de esa
memoria para almacenar nueva informacion.
Matem aticamente se puede modelar esto como una funci on que dada la matriz X,
junto con el n umero de las n y el n umero de columnas m (aunque este ultimo no se
requiere, pero se suele utilizar), se retorna la porcion del espacio de la memoria M
X
que
es utilizado para almacenar la matriz X, esto se hace liberando cada uno de los arreglos
la que conforman la matriz, de esta manera la funci on se puede escribir as
12.3. LAS MATRICES EN COMPUTACI

ON 193
liberar matriz T T

N N

(M}
(X, n, m} M
X
Para traducir esta funci on a C++ se debe tener en cuenta que la funcion no retorna un
valor de un tipo de datos, si no que se regresa memoria al sistema operativo, por lo que la
funci on regresa un espacio que esta vaco y listo para utilizarse de nuevo.
El desbloqueo de la memoria y la liberaci on del espacio utilizado por cada uno de los
arreglos la X
i
se escribe en C++ mediante la instruccion
delete[] X[i];
Luego de liberar cada uno de los arreglos la se debe liberar el arreglo columna que los
contena, esto se escribe en C++ mediante la instruccion
delete[] X;
Al igual que en el caso de los arreglos, para decir que se retorna memoria vaca, en C++
esto se escribe como void y en el cuerpo de la funci on se utiliza la instrucci on return;
para indicar que se retorno una porcion de espacio que esta vaci o y que queda listo para
usarse de nuevo.
De esta manera, la traduccion de la funcion en C++ se escribe de la siguiente manera
void liberar_matriz_T(T** X, int n, int m){
for(int i = 0; i < n; i++){
delete[] X[i]; // libera la memoria usada por los n arreglos fila
};
delete[] X; // libera la memoria usada por el arreglo columna
return;
};

n
m

n 1
m
194 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES

n 2
m

2
m




1
m

Ejemplo. Para liberar la memoria usada por una matriz de tipo entero se tiene la siguiente
funci on
void liberar_matriz_int(int** X, int n, int m){
for(int i = 0; i < n; i++){
delete[] X[i];
};
delete[] X;
return;
};
12.3.1.3. Matrices y ujos de datos
Dada una matriz de tipo T, es posible realizar operaciones de lectura y escritura sobre
ujos de datos, y dichas operaciones se realizan de la siguiente manera:
Lectura de matrices: para la entrada o lectura de una matriz desde un ujo de datos,
se puede utilizar la siguiente funcion
12.3. LAS MATRICES EN COMPUTACI

ON 195
leer matriz T IS T

N N T

(is, X, n, m} X, donde X
ij
= leer T(is},
i = 1, 2, 3, . . . , n,
j = 1, 2, 3, . . . , m
En C++ se traduce as (como se menciono previamente, las matrices en C++ comienzan
en la posici on (0, 0})
T** leer_matriz_T(istream& is, T** X, int n, int m){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
X[i][j] = leer_T(is);
};
};
return X;
};
Ejemplo. En C++ para leer una matriz de tipo entero se utiliza la siguiente funci on
int** leer_matriz_int(istream& is, int** X, int n, int m){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
X[i][j] = leer_int(is);
};
};
return X;
};
1
2
3
5
8 13 21
n = 2, m = 3,
2
2
2
3
5
8 13 21
n = 2, m = 3,
i = 0, j = 0
3
2 3
3
5
8
13 21
n = 2, m = 3,
i = 0, j = 1
4
2 3 5
5
8
13
21
n = 2, m = 3,
i = 0, j = 2
196 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


5
2 3 5
8
13
21
n = 2, m = 3,
i = 0, j = 3
6
8
2 3 5
8
13
21
n = 2, m = 3,
i = 1, j = 0
7
8 13
2 3 5
13
21
n = 2, m = 3,
i = 1, j = 1
8
8 13 21
2 3 5
21
n = 2, m = 3,
i = 1, j = 2
9
8 13 21
2 3 5
n = 2, m = 3,
i = 1, j = 3
10
8 13 21
2 3 5
n = 2, m = 3,
i = 2, j = 3
Escritura de matrices: para enviar o escribir una matriz en un ujo de datos, se puede
denir la siguiente funci on
escribir matriz T OS T

N N OS
(os, X, n, m} os, donde escribir T(X
ij
, os},
i = 1, 2, 3, . . . , n,
j = 1, 2, 3, . . . , m
En C++ se traduce as
12.3. LAS MATRICES EN COMPUTACI

ON 197
ostream& escribir_matriz_T(ostream& os, T** X, int n, int m){
escribir_char(\n, os);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
escribir_T(X[i][j], os);
if(j < m - 1){
escribir_char(\t, os);
};
};
escribir_char(\n, os);
};
return os;
};
Ejemplo. En C++ para escribir una matriz de tipo entero se utiliza la siguiente funci on
ostream& escribir_matriz_int(ostream& os, int** X, int n, int m){
escribir_char(\n, os);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
escribir_int(X[i][j], os);
if(j < m - 1){
escribir_char(\t, os);
};
};
escribir_char(\n, os);
};
return os;
};
1
8 13 21
2 3 5

n = 2, m = 3,
2
8 13 21
2 3 5
2
n = 2, m = 3,
i = 0, j = 0
3
8 13 21
2 3 5
2
n = 2, m = 3,
i = 0, j = 0
4
8 13 21
2 3 5
3 2
n = 2, m = 3,
i = 0, j = 1
198 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


5
8 13 21
2 3 5
3 2

n = 2, m = 3,
i = 0, j = 1
6
8 13 21
2 3 5
5 3
2

n = 2, m = 3,
i = 0, j = 2
7
8 13 21
2 3 5
5 3
2
n = 2, m = 3,
i = 0, j = 3
8
8 13 21
2 3 5
8 5
3
2
n = 2, m = 3,
i = 1, j = 0
9
8 13 21
2 3 5
8 5
3 2
n = 2, m = 3,
i = 1, j = 0
10
8 13 21
2 3 5
13 8
5
3 2

n = 2, m = 3,
i = 1, j = 1
11
8 13 21
2 3 5
13 8

5 3
2

n = 2, m = 3,
i = 1, j = 1
12
8 13 21
2 3 5
21 13
8
5 3
2
n = 2, m = 3,
i = 1, j = 2
13
8 13 21
2 3 5
21 13
8 5
3
2
n = 2, m = 3,
i = 1, j = 3
14
8 13 21
2 3 5
21 13
8 5
3
2
n = 2, m = 3,
i = 2, j = 3
12.3. LAS MATRICES EN COMPUTACI

ON 199
15

2 3 5
8 13 21
2 3 5
8 13 21
12.3.2. Ejemplos de funciones con matrices
Es posible utilizar lo visto en funciones para realizar diversidad de calculos que involu-
cren matrices.
Ejemplo. El cuadrado de las componentes de matrices numericas enteras
Suponga que un archivo contiene unos datos numericos enteros tales que consta de 5
lneas de texto y en cada lnea hay dos n umeros escritos que se encuentran separados por
una tabulacion as como se muestra a continuacion
0 1
2 3
4 5
6 7
8 9
Una funcion general que permite construir una nueva matriz que contiene el cuadrado
de cada componente de una matriz dada es
cuadrado matriz Z

N N Z

(X, n, m} Y, donde Y
ij
= X
2
ij
,
i = 1, 2, . . . , n,
j = 1, 2, . . . , m
Un programa completo en C++ que permite calcular el cuadrado de las componentes
de una matriz obtenida a partir del archivo presentado anteriormente es
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
200 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


int** crear_matriz_int(int n, int m){
int** X = new int*[n];
for(int i = 0; i < n; i++){
X[i] = new int[m];
};
return X;
};
void liberar_matriz_int(int** X, int n, int m){
for(int i = 0; i < n; i++){
delete[] X[i];
};
delete[] X;
return;
};
int** leer_matriz_int(istream& is, int** X, int n, int m){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
X[i][j] = leer_int(is);
};
};
return X;
};
ostream& escribir_matriz_int(ostream& os, int** X, int n, int m){
escribir_char(\n, os);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
escribir_int(X[i][j], os);
if(j < m - 1){
escribir_char(\t, os);
};
};
escribir_char(\n, os);
};
return os;
};
12.3. LAS MATRICES EN COMPUTACI

ON 201
int** cuadrado_matriz(int** X, int n, int m){
int** Y = crear_matriz_int(n, m);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
Y[i][j] = X[i][j] * X[i][j];
};
};
return Y;
};
int main(){
int n = 5;
int m = 2;
ifstream ifs("matriz_numeros.txt");
ofstream ofs("matriz_cuadrados.txt");
int** X = crear_matriz_int(n, m);
X = leer_matriz_int(ifs, X, n, m);
int** Y = cuadrado_matriz(X, n, m);
escribir_matriz_int(ofs, Y, n, m);
liberar_matriz_int(X, n, m);
liberar_matriz_int(Y, n, m);
ifs.close();
ofs.close();
cout << "El calculo de la matriz fue exitoso" << endl;
system("pause");
return EXIT_SUCCESS;
};
Ejemplo. Tablas de multiplicar
Se puede generar una matriz que represente las tablas de multiplicar multiplicando cada
posicion (i, j} de la matriz y almacenandola en la matriz:
tablas mult N N Z

(n, m} X, donde X
ij
= i j,
i = 1, 2, . . . , n,
j = 1, 2, . . . , m
En C++:
202 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


int** tablas_mult(int n, int m){
int** X = crear_matriz_int(n, m);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
X[i-1][j-1] = i * j;
};
};
return X;
};
Ejemplo. Determinantes 2 2
Dado un sistema de ecuaciones de dos ecuaciones con dos inc ognitas
ax + by = c
a

x + b

y = c

este sistema de ecuaciones se puede expresar mediante matrices de la siguiente manera


_
a b
a

_ _
x
y
_ = _
c
c

_
una solucion del sistema es una pareja (x
0
, y
0
} tal que
ax
0
+ by
0
= c y a

x
0
+ b

y
0
= c

.
El sistema tiene una soluci on unica si la expresi on ab

b 0, a dicha expresi on se
le conoce como el determinante de la matriz, y efectivamente sirve para determinar si un
sistema tiene una unica soluci on, o si no tiene, o si no es unica. A continuacion se presenta
una funcion que permite calcular el determinante de una matriz 2 2.
det 2 2 R
22
R
X X
11
X
22
X
21
X
12
En C++:
double det_2_2(int** X){
return X[0][0] * X[1][1] - X[1][0] * X[0][1];
};
Ejemplo. Producto escalar
Una de los operaciones basicas sobre las matrices es el producto escalar. En este se elige
un valor sobre un campo (por ejemplo los reales R) y se multiplica este valor por cada
componente de la matriz.
12.3. LAS MATRICES EN COMPUTACI

ON 203
As, si R y X =

x
11
x
12
x
1m
x
21
x
22
x
2m

x
n1
x
n2
x
nm

entonces
Y = X =

x
11
x
12
x
1m
x
21
x
22
x
2m

x
n1
x
n2
x
nm

x
11
x
12
x
1m
x
21
x
22
x
2m

x
n1
x
n2
x
nm

La denicion de esta funci on sera formalmente


producto escalar R R

N N R

(, X, n, m} Y, donde Y
ij
= X
ij
,
i = 1, 2, . . . , n,
j = 1, 2, . . . , m
En C++:
double** producto_escalar(double alpha, double** X, int n, int m){
double** Y = crear_matriz_double(n,m);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
Y[i][j] = alpha * X[i][j];
};
};
return Y;
};
204 CAP

ITULO 12. MATRICES O ARREGLOS BIDIMENSIONALES


Ejercicios
1. Desarrollar un algoritmo que permita hallar el vector soluci on de un sistema de dos
ecuaciones con dos inc ognitas, utilizando la regla de Cramer.
2. Desarrollar un algoritmo que permita hallar la matriz inversa de una matriz 2 2, si
esta existe.
3. Desarrollar un algoritmo que permita calcular el determinante de una matriz 3 3,
utilizando la regla de Sarrus.
4. Desarrollar un algoritmo que permita hallar el vector solucion de un sistema de tres
ecuaciones con tres inc ognitas, utilizando la regla de Cramer.
5. Desarrollar un algoritmo que permita calcular la traza de una matriz cuadrada.
6. Desarrollar un programa que sume los elementos de una columna dada de una matriz.
7. Desarrollar un programa que sume los elementos de una la dada de una matriz.
8. Desarrollar un algoritmo que permita sumar dos matrices de n umeros reales.
9. Desarrollar un algoritmo que permita hallar la transpuesta de una matriz.
10. Desarrollar un algoritmo que permita multiplicar dos matrices de n umeros reales.
11. Desarrollar un algoritmo que determine si una matriz es m agica. Se dice que una
matriz cuadrada es magica si la suma de cada una de sus las, de cada una de sus
columnas y de cada diagonal es igual. Ejemplo:

8 1 6
3 5 7
4 9 2

12. Desarrollar un algoritmo que dado un entero, reemplace en una matriz todos los
n umeros mayores al n umero dado por un uno y todos los menores o iguales por un
cero.
Si el n umero dado es: 5 y una matriz en el arreglo es:

8 1 6
3 5 7
4 9 2

La matriz de salida es:

1 0 1
0 0 1
0 1 0

12.3. LAS MATRICES EN COMPUTACI

ON 205
13. Desarrollar un programa que genere una matriz marco cuadrada de tama no n n.
Entrada: n = 3

1 1 1
1 0 1
1 1 1

14. Desarrollar un programa que tome un arreglo de tama no n


2
y llene en espiral hacia
adentro una matriz cuadrada de tama no n.
Ejemplo: arreglo de entrada: |1, 2, 3, 4, 5, 6, 7, 8, 9|, la matriz de salida es:

1 2 3
8 9 4
7 6 5

15. Desarrollar un algoritmo que permita resolver un sistema de n ecuaciones con n


inc ognitas, usando el metodo de eliminacion de Gauss-Jordan.
16. Desarrollar un algoritmo que permita hallar la matriz inversa de una matriz cuadra-
da, si esta existe.
17. Desarrollar un algoritmo que permita calcular el determinante de una matriz cua-
drada, usando el teorema de Laplace (desarrollo por menores y cofactores).

Вам также может понравиться