Está en la página 1de 19

Capı́tulo 13

Matrices o arreglos bidimensionales

13.1. Conceptos y notación


Una matriz es un arreglo rectangular de objetos, los cuales generalmente son números,
caracteres, valores booleanos, y cualesquiera otro tipo de elementos que pertenecen a un
mismo conjunto.

Ejemplo. La siguiente estructura rectangular de números enteros denotada por la expre-


sión X es una matriz

⎡1 3 7 −2 8⎤
⎢ ⎥
⎢ ⎥
X = ⎢9 11 5 6 4⎥
⎢ ⎥
⎢6 −2 −1 1 1⎥
⎣ ⎦

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

⎡ x11 x12 x13 ⋯ x1(m−1) x1m ⎤⎥



⎢ x21 ⋯ x2m ⎥⎥
⎢ x22 x23 x2(m−1)
⎢ ⎥
X =⎢ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⎥
⎢ ⎥
⎢x(n−1)1 x(n−1)2 x(n−1)3 ⋯ x(n−1)(m−1) x(n−1)m ⎥
⎢ ⎥
⎢ x ⋯ xnm ⎥⎦
⎣ n1 xn2 xn3 xn(m−1)
donde la matriz está compuesta por n filas y m columnas, a esta matriz se le dice que es
de tamaño n × m.

⎡ x11 x12 ⋯ x1m ⎤⎥



⎢x ⋯ x2m ⎥⎥
⎢ x22
X = ⎢ 21 ⎥ n
⎢ ⋮ ⋮ ⋱ ⋮ ⎥⎥

⎢xn1 xn2 ⋯ xnm ⎥⎦

m
231
232 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES

Ejemplo. La siguiente matriz es una matriz de tamaño 4 × 5


⎡0 0⎤⎥
⎢ 0 0 0
⎢0 0⎥⎥
⎢ 0 0 0
X =⎢ ⎥
⎢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 ésta se le dice que es la componente en la
posición (i, j), esto significa que el objeto es la componente ubicada en la fila i y en el
columna j, se denota por la expresión Xij y se puede ubicar dentro de la matriz como se
muestra a continuación

columna j

⎡ x11 ⋯ ⋯ x1m ⎤⎥
⎢ x1j
⎢ ⋮ ⋱ ⋮ ⋱ ⋮ ⎥⎥

⎢ ⎥
⎢ xi1 ⋯ xij ⋯ xim ⎥⎥
fila i ⎢
⎢ ⎥
⎢ ⋮ ⋱ ⋮ ⋱ ⋮ ⎥⎥

⎢xn1 ⋯ xnj ⋯ xnm ⎥⎦

Ejemplo. Para la matriz


⎡ 2 −1 43 −0.25 e ⎤⎥

⎢ 1 √ ⎥
⎢ −5 2 4 √ 0.0 6 ⎥⎥

X =⎢
⎢3.14
√ π 12 3 3 ⎥⎥
⎢ 3 ⎥
⎢ 5 −10 0 −5 0.9⎥
⎣ ⎦
de tamaño 4 × 5 se tiene que sus componentes son:

• X11 = 2. • X21 = − 15 . • X31 = 3.14. • X41 = 3
5.

• X12 = −1. • X22 = 2. • X32 = π. • X42 = −10.

• X13 = 34 . • X23 = 4. • X33 = 12 . • X43 = 0.



• X14 = −0.25. • X24 = 0.0. • X34 = 3. • X44 = −5.

• X15 = e. • X25 = 6. • X35 = 3. • X45 = 0.9.

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.

Ejemplo. La siguiente matriz de tamaño 2 × 2, es una matriz cuadrada cuyas entradas


son valores del conjunto booleano (B)
13.2. DEFINICIONES ALTERNATIVAS 233

V F
X =[ ]
F V

Ejemplo. La siguiente matriz de tamaño 4 × 4, es una matriz cuadrada cuyas entradas


son números reales, se le conoce como la matriz identidad de tamaño 4 × 4 y se denota por
la expresión I4
⎡1 0 0 0⎤
⎢ ⎥
⎢0 1 0 0⎥
⎢ ⎥
I4 = ⎢ ⎥
⎢0 0 1 0⎥
⎢ ⎥
⎢0 0 0 1⎥
⎣ ⎦

13.2. Definiciones alternativas

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:

i) Definición de matrices por vectores fila


Una matriz puede verse como un vector columna cuyas componentes son vectores
fila, ası́ una matriz es un vector de tamaño n × 1 cuyas componentes son vectores de
tamaño 1 × m.

⎡ ⎤
⎡ 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

ii) Definición de matrices por vectores columna


Una matriz puede verse como un vector fila cuyas componentes son vectores columna,
ası́ una matriz es un vector de tamaño 1 × m cuyas componentes son vectores de
tamaño n × 1.

⎡ x11 ⋯ x1j ⋯ x1m ⎤⎥ ⎡⎡ x ⎤ ⎡ x1j ⎤ ⎡ x1m ⎤⎤⎥


⎢ ⎢⎢ 11 ⎥ ⎢ ⎥ ⎢ ⎥
⎢x ⎢⎢ ⎥ ⎢ x ⎥⎥⎥
⎢ 21 ⋯ x2j ⋯ x2m ⎥⎥ ⎢⎢ x21 ⎥ ⎢x ⎥

⎢⎢ ⎥ ⋯ ⎢ ⎥ ⋯ ⎢ ⎥ ⎢ ⎥⎥
n ⎢ ⎥ = ⎢⎢ ⋮ ⎥
2j 2m
⎥⎥ 1
⎢ ⋮ ⋱ ⋮ ⋱ ⋮ ⎥⎥ ⎢⎢ ⎥ ⎢ ⋮ ⎥ ⎢ ⋮ ⎥⎥
⎢ ⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎥
⎢xn1 ⋯ xnj ⋯ xnm ⎥⎦ ⎢⎣xn1 ⎦ ⎢ ⎥ ⎢xnm ⎥⎦⎥
⎣ ⎣ ⎣xnj ⎦ ⎣ ⎦
m m
234 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES

13.2.1. El conjunto de las matrices

En el capı́tulo 11 sobre arreglos, se definió un arreglo a partir del producto generalizado


de un conjunto T. El conjunto de los arreglos T∗ se definió como la unión de todos los
productos cartesianos del conjunto T, de la siguiente manera

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 .

13.3. Las matrices en computación

Dado un conjunto de tipo de datos T, a partir de la definición del conjunto de matrices


se define 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 colección de variables del tipo
de datos T que están doblemente subindicadas, esto es, que se accede a ellas por medio
de un par de indices que especifican una componente particular en una matriz, para esto
es necesario saber el número de su fila (primer subı́ndice) y el de su columna (segundo
subı́ndice).
Cuando se define una matriz de tamaño n × m en C++ o en Java, es necesario tener
en cuenta que la primera componente de la matriz está ubicada en la posición (0, 0) y la
última componente estará ubicada en la posición (n − 1, m − 1), análogamente a lo que
ocurrı́a 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

Xij ≡ X[i-1][j-1]

Cuando se define una matriz de tamaño n × m en SciLab o en MatLab, la primera com-


ponente de la matriz está ubicada en la posición (1, 1) y la última componente estará
13.3. LAS MATRICES EN COMPUTACIÓN 235

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]

13.3.1. Funciones para utilizar matrices

13.3.1.1. Creación de matrices

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

crear matriz T ∶ N × N → T∗∗


(n, m) ↦ X, donde X ∈ Tn×m ⊊ T∗∗

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]

En C++ la anterior función se traduce como

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;
};

Ejemplo. Para crear una matriz de tipo entero se tiene la siguiente función

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;
};

13.3.1.2. Eliminación 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ó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

liberar matriz T ∶ T∗∗ × N × N → ℘(M)


(X, n, m) ↦ MX

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

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;
};
Ejemplo. Para liberar la memoria usada por una matriz de tipo entero se tiene la siguiente
función

void liberar_matriz_int(int** X, int n, int m){


for(int i = 0; i < n; i++){
delete[] X[i];
};
delete[] X;
return;
};

13.3.1.3. Matrices y flujos de datos

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

leer matriz T ∶ IS × T∗∗ × N × N → T∗∗


(is, X, n, m) ↦ X, donde Xij = leer T(is),
∀i = 1, 2, 3, . . . , n,
∀j = 1, 2, 3, . . . , m
13.3. LAS MATRICES EN COMPUTACIÓN 239

En C++ se traduce ası́ (como se mencionó previamente, las matrices en C++ comienzan
en la posición (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ón

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

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

escribir matriz T ∶ OS × T∗∗ × N × N → OS


(os, X, n, m) ↦ os, donde escribir T(os, Xij ),
∀i = 1, 2, 3, . . . , n,
∀j = 1, 2, 3, . . . , m

En C++ se traduce ası́

ostream& escribir_matriz_T(ostream& os, T** X, int n, int m){


for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
escribir_T(os, X[i][j]);
escribir_char(os, ’\t’);
};
escribir_char(os, ’\n’);
};
return os;
};

Ejemplo. En C++ para escribir una matriz de tipo entero se utiliza la siguiente función
13.3. LAS MATRICES EN COMPUTACIÓN 241

ostream& escribir_matriz_int(ostream& os, int** X, int n, int m){


for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
escribir_int(os, X[i][j]);
escribir_char(os, ’\t’);
};
escribir_char(os, ’\n’);
};
return os;
};

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

13.3.2. Ejemplos de funciones con matrices

Es posible utilizar lo visto en funciones para realizar diversidad de cálculos que involu-
cren matrices.

Ejemplo. El cuadrado de las componentes de matrices numéricas enteras

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

cuadrado componentes matriz ∶ Z∗∗ × N × N → Z∗∗


(X, n, m) ↦ Y, donde Yij = Xij2 ,
∀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;

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_int(istream& is){


int a;
is >> a;
return a;
};
244 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES

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_int(ostream& os, int a){


os << a;
return os;
};

ostream& escribir_char(ostream& os, char a){


os << a;
return os;
};

ostream& escribir_matriz_int(ostream& os, int** X, int n, int m){


for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
escribir_int(os, X[i][j]);
escribir_char(os, ’\t’);
};
escribir_char(os, ’\n’);
};
return os;
};

int** cuadrado_componentes_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;
};
13.3. LAS MATRICES EN COMPUTACIÓN 245

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;
};

El archivo obtenido como salida de la ejecución del anterior programa es el siguiente

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:

tablas mult ∶ N × N → N∗∗


(n, m) ↦ X, donde Xij = i ∗ j,
∀i = 1, 2, . . . , n,
∀j = 1, 2, . . . , m

En C++:

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;
};
246 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES

Ejemplo. Determinantes 2 × 2
Dado un sistema de ecuaciones de dos ecuaciones con dos incógnitas

ax + by = c
a x + b′ y = c ′

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

a b x c
[ ′ ′] [ ] = [ ′]
a b y c

una solución del sistema es una pareja (x0 , y0 ) tal que

ax0 + by0 = c y a′ x 0 + b ′ y 0 = c ′ .

El sistema tiene una solución única si la expresión a ∗ b′ − a′ ∗ b ≠ 0, a dicha expresión se


le conoce como el determinante de la matriz, y efectivamente sirve para determinar si un
sistema tiene una única solución, o si no tiene, o si no es única. A continuación se presenta
una función que permite calcular el determinante de una matriz 2 × 2.

det 2 2 ∶ Z2×2 → Z
X ↦ X11 ∗ X22 − X21 ∗ X12

En C++:

int 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 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

La definición de esta función serı́a formalmente

producto escalar ∶ Z × Z∗∗ × N × N → Z∗∗


(α, X, n, m) ↦ Y, donde Yij = α ∗ Xij ,
∀i = 1, 2, . . . , n,
∀j = 1, 2, . . . , m

En C++:

int** producto_escalar(int alpha, 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] = alpha * X[i][j];
};
};
return Y;
};
248 CAPÍTULO 13. MATRICES O ARREGLOS BIDIMENSIONALES

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.

2. Desarrollar un algoritmo que permita hallar la matriz inversa de una matriz 2 × 2, si


ésta 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 solución de un sistema de tres


ecuaciones con tres incógnitas, 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 fila dada de una matriz.

8. Desarrollar un algoritmo que permita sumar dos matrices de números reales.

9. Desarrollar un algoritmo que permita hallar la transpuesta 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⎥
⎣ ⎦

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


incógnitas, usando el método de eliminación de Gauss-Jordan.

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).

También podría gustarte