Академический Документы
Профессиональный Документы
Культура Документы
1 3 7 2 8
9 11 5 6 4
6 2 1 1 1
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
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
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
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
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
=
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
=
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
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
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
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
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
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
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
x + b
y = c
_ _
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
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
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
1 0 1
0 0 1
0 1 0
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
1 2 3
8 9 4
7 6 5