Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Libro Programacion-Cap12 PDF
Libro Programacion-Cap12 PDF
⎡1 3 7 −2 8⎤
⎢ ⎥
⎢ ⎥
X = ⎢9 11 5 6 4⎥
⎢ ⎥
⎢6 −2 −1 1 1⎥
⎣ ⎦
columna j
⎡ x11 ⋯ ⋯ x1m ⎤⎥
⎢ x1j
⎢ ⋮ ⋱ ⋮ ⋱ ⋮ ⎥⎥
⎢
⎢ ⎥
⎢ xi1 ⋯ xij ⋯ xim ⎥⎥
fila i ⎢
⎢ ⎥
⎢ ⋮ ⋱ ⋮ ⋱ ⋮ ⎥⎥
⎢
⎢xn1 ⋯ xnj ⋯ xnm ⎥⎦
⎣
Cuando en una matriz se tiene que el número de filas es igual al número de columnas
se dice que la matriz es cuadrada.
V F
X =[ ]
F V
Una forma de entender la estructura interna de una matriz distinta a la definida 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ón:
⎡ ⎤
⎡ x11 x12 ⋯ x1m ⎤⎥ ⎢ [ x11 x12 ⋯ x1m ] ⎥
⎢ ⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥ ⎢ ⋮ ⎥
⎢ ⎢ ⎥
⎢ ⎥ ⎢
= ⎢ [ xi1 xi2 ⋯ xim ] ⎥⎥ n
n ⎢ xi1 xi2 ⋯ xim ⎥
⎢ ⎥ ⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥ ⎢ ⋮ ⎥
⎢ ⎢ ⎥
⎢x ⋯ xnm ⎥⎦ ⎢[ x ⎥
⎣ n1 n2
x ⎢ n1 xn2 ⋯ xnm ]⎥
⎣ ⎦
m
1
T∗ = ⋃ Tm
m∈N
A partir del concepto de arreglo y usando la definición i) de matrices por vectores fila se
puede ahora definir el conjunto de las matrices T∗∗ como la unión de todos los productos
cartesianos del conjunto de los arreglos del conjunto T, de la siguiente manera
n
T∗∗
= ⋃(⋃ Tm )
m∈N
n∈N
El producto externo debe entenderse como un producto cartesiano que genera vectores
columna y que internamente genera vectores fila, ası́ como en la definición i).
Un elemento genérico del conjunto T∗∗ es de la forma (Tm )n , donde n es el número
de filas y m es el número de columnas. Para abreviar, de aquı́ en adelante se utilizará la
notación
(Tm )n ⇔ Tn×m .
Xij ≡ X[i-1][j-1]
ubicada en la posición (n, m), similar a como se manejan las posiciones en notación ma-
temática de matrices, es decir, para acceder en SciLab o MatLab a la variable almacenada
en la componente(i, j) se utiliza la equivalencia
Xij ≡ X[i][j]
Matemáticamente se definirá una rutina para la creación de una matriz de tipo de datos
T como aquella rutina que dado un n ∈ N, que representa el número de componentes del
arreglo columna, y m ∈ N que correspondiente al tamaño del cada arreglo fila, retornará
una matriz de T∗∗ de la siguiente manera
Primero se crea un vector columna de tamaño n y luego por cada componente de éste
se crea y se asigna un vector fila de tamaño m, ası́ como se presenta a continuación:
À Á Â m
[2 2 ⋯ 2] 1
n ⋮ n ⋮
à m Ä m
[2 2 ⋯ 2] [2 2 ⋯ 2]
2
[2 2 ⋯ 2] [2 2 ⋯ 2] n−2
n ⋮ n ⋮ ⋮
236 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES
Å m Æ m
[2 2 ⋯ 2] [2 2 ⋯ 2]
[2 2 ⋯ 2] [2 2 ⋯ 2]
n−1
n ⋮ ⋮ n ⋮ ⋮ n
[2 2 ⋯ 2] [2 2 ⋯ 2]
[2 2 ⋯ 2]
Ejemplo. Para crear una matriz de tipo entero se tiene la siguiente función
Para eliminar una matriz, ası́ como en el caso de los arreglos, se debe entender que lo
que ocurre es que la porción del espacio de la memoria que se utiliza para almacenar los
arreglos fila de la matriz se regresan al sistema operativo para que este disponga de esa
memoria para almacenar nueva información.
Matemáticamente se puede modelar esto como una función que dada la matriz X, junto
con el número de filas n y el número de columnas m (aunque este último no se requiere,
pero se suele utilizar), se retorna la porción del espacio de la memoria MX , que es utilizado
para almacenar la matriz X. De esta manera la función se puede escribir ası́
13.3. LAS MATRICES EN COMPUTACIÓN 237
La liberación de la matriz se puede hacer liberando cada uno de los arreglos fila que
conforman la matriz y por último se elimina el arreglo columna, ası́ como se presenta a
continuación:
À Á
[2 2 ⋯ 2]
[2 2 ⋯ 2] [2 2 ⋯ 2]
n ⋮ ⋮ n n ⋮ ⋮
n−1
[2 2 ⋯ 2] [2 2 ⋯ 2]
[2 2 ⋯ 2] [2 2 ⋯ 2]
m m
 Ã
n ⋮ ⋮ n ⋮
[2 2 ⋯ 2] n−2 [2 2 ⋯ 2] 2
[2 2 ⋯ 2] [2 2 ⋯ 2]
m m
Ä Å Æ
n ⋮ n ⋮
[2 2 ⋯ 2] 1
m
Para traducir la anterior función a C++ se debe tener en cuenta que la función no
retorna un valor de un tipo de datos, si no que se regresa memoria al sistema operativo,
por lo que la función regresa un espacio que esta vacı́o y listo para utilizarse de nuevo.
El desbloqueo de la memoria y la liberación del espacio utilizado por cada uno de los
arreglos fila Xi se escribe en C++ mediante la instrucción
238 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES
delete[] X[i];
Luego de liberar cada uno de los arreglos fila se debe liberar el arreglo columna que los
contenı́a, esto se escribe en C++ mediante la instrucción
delete[] X;
Al igual que en el caso de los arreglos, para decir que se retorna memoria vacı́a, en C++
esto se escribe como void y en el cuerpo de la función se utiliza la instrucción return;
para indicar que se retorno una porción de espacio que esta vació y que queda listo para
usarse de nuevo.
De esta manera, la traducción de la función en C++ se escribe de la siguiente manera
Dada una matriz de tipo T, es posible realizar operaciones de lectura y escritura sobre
flujos de datos, y dichas operaciones se realizan de la siguiente manera:
Lectura de matrices: para la entrada o lectura de una matriz desde un flujo de datos,
se puede utilizar la siguiente función
En C++ se traduce ası́ (como se mencionó previamente, las matrices en C++ comienzan
en la posición (0, 0))
1 2
2
2 2
3 3
5 5
n = 2, m = 3, n = 2, m = 3,
21 13 8 21 13 8 i = 0, j = 0
3 4
2 3 2 3 5
3 5
5 8
8 13
n = 2, m = 3, n = 2, m = 3,
21 13 i = 0, j = 1 21 i = 0, j = 2
5 6
2 3 5 2 3 5
8 8
13 13 8
21 21
n = 2, m = 3, n = 2, m = 3,
i = 0, j = 3 i = 1, j = 0
240 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES
7 8
2 3 5 2 3 5
13 21
21 8 13 8 13 21
n = 2, m = 3, n = 2, m = 3,
i = 1, j = 1 i = 1, j = 2
9 10
2 3 5 2 3 5
8 13 21 8 13 21
n = 2, m = 3, n = 2, m = 3,
i = 1, j = 3 i = 2, j = 3
Escritura de matrices: para enviar o escribir una matriz en un flujo de datos, se puede
definir la siguiente función
Ejemplo. En C++ para escribir una matriz de tipo entero se utiliza la siguiente función
13.3. LAS MATRICES EN COMPUTACIÓN 241
2
1
2 3 5 2 3 5
8 13 21 8 13 21
n = 2, m = 3, n = 2, m = 3, 2 ↵
↵
i = 0, j = 0
3 4
2 3 5 2 3 5
8 13 21 8 13 21
n = 2, m = 3, 2 ↵ n = 2, m = 3, 3 2 ↵
i = 0, j = 0 i = 0, j = 1
5 6
2 3 5 2 3 5
8 13 21 8 13 21 ↵
↵ 2
n = 2, m = 3, 3 2 n = 2, m = 3, 5 3
i = 0, j = 1 i = 0, j = 2
7 8
2 3 5 2 3 5
8 13 21 ↵ 2
8 13 21 ↵ 2
3
n = 2, m = 3, ↵ 5 3 n = 2, m = 3, 8 ↵ 5
i = 0, j = 3 i = 1, j = 0
242 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES
9 10
2 3 5 2 3 5
↵
8 13 21 ↵ 2 3
8 13 21 2 3
5
n = 2, m = 3, 8 ↵ 5 n = 2, m = 3, 13 8 ↵
i = 1, j = 0 i = 1, j = 1
11 12
2 3 5 ↵ 2 3 5 2 ↵
2
8 13 21 3 5
8 13 21 3 5 ↵
↵ 8
n = 2, m = 3, 13 8 n = 2, m = 3, 21 13
i = 1, j = 1 i = 1, j = 2
13 14
2 3 5 2 ↵ 2 3 5 2 ↵
3 3
8 13 21 5 ↵ 8
8 13 21 5 ↵ 8
n = 2, m = 3, ↵ 21 13 n = 2, m = 3, ↵ 21 13
i = 1, j = 3 i = 2, j = 3
15
↵
2 3 5 ↵ 2 3 5
8 13 21 ↵ 8 13 21
Es posible utilizar lo visto en funciones para realizar diversidad de cálculos que involu-
cren matrices.
Suponga que un archivo contiene unos datos numéricos enteros tales que consta de 5
lı́neas de texto y en cada lı́nea hay dos números escritos que se encuentran separados por
una tabulación ası́ como se muestra a continuación
13.3. LAS MATRICES EN COMPUTACIÓN 243
0 1
2 3
4 5
6 7
8 9
Una función general que permite construir una nueva matriz que contiene el cuadrado
de cada componente de una matriz dada es
#include<iostream>
#include<cstdlib>
#include<fstream>
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_componentes_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;
};
0 1
4 9
16 25
36 49
64 81
Ejemplo. Tablas de multiplicar
Se puede generar una matriz que represente las tablas de multiplicar multiplicando cada
posición (i, j) de la matriz y almacenándola en la matriz:
En C++:
Ejemplo. Determinantes 2 × 2
Dado un sistema de ecuaciones de dos ecuaciones con dos incógnitas
ax + by = c
a x + b′ y = c ′
′
a b x c
[ ′ ′] [ ] = [ ′]
a b y c
ax0 + by0 = c y a′ x 0 + b ′ y 0 = c ′ .
det 2 2 ∶ Z2×2 → Z
X ↦ X11 ∗ X22 − X21 ∗ X12
En C++:
Una de los operaciones básicas sobre las matrices es el producto escalar. En éste se elige
un valor sobre un conjunto numérico (por ejemplo los enteros Z) y se multiplica este valor
por cada componente de la matriz.
⎡ x11 x12 ⋯ x1m ⎤
⎢ ⎥
⎢x ⎥
⎢ 21 x22 ⋯ x2m ⎥
Ası́, si α ∈ Z y X = ⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥
⎢
⎢xn1 xn2 ⋯ xnm ⎥
⎣ ⎦
entonces
⎡ x11 x12 ⋯ x1m ⎤⎥ ⎡⎢ α ⋅ x11 α ⋅ x12 ⋯ α ⋅ x1m ⎤⎥
⎢
⎢x ⋯ x2m ⎥⎥ ⎢⎢ α ⋅ x21 α ⋅ x22 ⋯ α ⋅ x2m ⎥⎥
⎢ x22
Y = α ∗ X = α ∗ ⎢ 21 ⎥=⎢ ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥ ⎢⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥
⎢
⎢xn1 xn2 ⋯ xnm ⎥⎦ ⎢⎣α ⋅ xn1 α ⋅ xn2 ⋯ α ⋅ xnm ⎥⎦
⎣
13.3. LAS MATRICES EN COMPUTACIÓN 247
En C++:
13.4. Ejercicios
1. Desarrollar un algoritmo que permita hallar el vector solución de un sistema de dos
ecuaciones con dos incógnitas, utilizando la regla de Cramer.
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 fila dada de una matriz.
10. Desarrollar un algoritmo que permita multiplicar dos matrices de números reales.
11. Desarrollar un algoritmo que determine si una matriz es mágica. Se dice que una
matriz cuadrada es mágica si la suma de cada una de sus filas, 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úmeros mayores al número dado por un uno y todos los menores o iguales por un
cero.
Si el número 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⎥
⎣ ⎦
13.4. EJERCICIOS 249
13. Desarrollar un programa que genere una matriz marco cuadrada de tamaño n × n.
Entrada: n = 3
⎡1 1 1⎤
⎢ ⎥
⎢ ⎥
⎢1 0 1⎥
⎢ ⎥
⎢1 1 1⎥
⎣ ⎦
14. Desarrollar un programa que tome un arreglo de tamaño n2 y llene en espiral hacia
adentro una matriz cuadrada de tamaño 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⎥
⎣ ⎦
16. Desarrollar un algoritmo que permita hallar la matriz inversa de una matriz cuadra-
da, si ésta 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).