Está en la página 1de 14

Capítulo 1

Vectores y matrices en MATLAB

Contenido:

1.1 Creación de vectores y matrices

1.2 Creación de matrices elementales

1.3 Álgebra Lineal en MATLAB

1.4 Funciones elementales con matrices o vectores como

argumentos

1.5 Operaciones y funciones dirigidas a los elementos de las

matrices

1.6 Extracción de elementos de vectores y matrices

1.7 Resumen

16
1.1 Creación de vectores y matrices

La forma más elemental de crear vectores y matrices consiste en introducir sus


elementos a través del teclado en la Ventana de Comandos de MATLAB. Aunque este
método sólo sirve cuando las dimensiones son pequeñas, merece la pena revisarlo para
poner de manifiesto las notaciones. Para una matriz de dos filas y tres columnas, se puede
escribir

» A=[1 2 3;4 5 6]

A
1 2 3
4 5 6

o bien

» A=[1 2 3
4 5 6]

A
1 2 3
4 5 6

En cada caso se observa la respuesta que devuelve el sistema, debido a que no


hemos colocado (;) a continuación de la línea de comando. Para un vector fila la escritura
será v=[1 2 3 4] y para el correspondiente vector columna w=[1;2;3;4].
Para vectores con decenas o cientos de elementos, el procedimiento puede ser la
lectura de un fichero externo o la generación de los elementos desde funciones de
MATLAB o construidas por el usuario. En efecto, se puede generar un fichero de texto
escribiendo los elementos de la matriz, con retorno de carro después de cada fila, por
ejemplo con el bloc de notas de Windows, lo que permite escribir matrices grandes, con
posibilidad de corregir fácilmente errores. Se guarda en el disco con una extensión (txt por
defecto en el bloc de notas) que no sea .mat. Si, por ejemplo, guardamos los datos con el
nombre matriz.txt, posteriormente se puede cargar la matriz en el espacio de trabajo por
medio de la orden load matriz.txt y queda almacenada en dicho espacio con el nombre
matriz.
Existen dos métodos importantes para generar vectores desde MATLAB. Uno
basado en el signo dos puntos (:) y otro basado en la orden linspace. Si escribimos n1:n2,
siendo n1<n2, generamos una lista n1+1, n1+2,..., n2:

17
» 15:26
ans =
15 16 17 18 19 20 21 22 23 24 25 26

Si escribimos x1:x2:x3, entonces la lista comienza con x1 y sigue con x1+x2,


x1+2*x2, hasta alcanzar x3, siendo el último número de la sucesión menor o igual que x3:

» 15:3:25
ans =
15 18 21 24
» 0:0.1:1
ans =
Columns 1 through 7
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
Columns 8 through 11
0.7000 0.8000 0.9000 1.0000

La orden linspace(a,b,n) devuelve un vector con n elementos igualmente


espaciados en el intervalo [a,b], el primero de los cuales es a y el último b. El valor de n es
100 por defecto.

» linspace(0,pi,10)
ans =
Columns 1 through 7
0 0.3491 0.6981 1.0472 1.3963 1.7453 2.0944
Columns 8 through 10
2.4435 2.7925 3.1416

Más adelante podremos introducir cambios por medio de operaciones lineales.


Supongamos introducidas dos matrices A y B en el espacio de trabajo. Si A es (m,n)
y B es (m,p), podemos construir una nueva matriz utilizando A y B como bloques,
C=[A B], cuyas dimensiones son (m,n+p). Si A es (m,n) y B(p,n), se puede construir
D=[A;B], de dimensiones (m+p,n).
La longitud de los vectores se puede medir con el comando length: length(V)
devuelve la longitud del vector V. Para determinar el tamaño de las matrices (y de los

18
vectores) se hace uso de size: size(A) devuelve las dimensiones de la matriz A. Hay que
advertir que la versión 5 de MATLAB admite, además de vectores y matrices, objetos
matriciales tridimensionales o pluridimensionales. Por ejemplo, si representamos una
imagen de escala de grises mediante una matriz (bidimensional), un vídeo será un arreglo
tridimensional.

1.2 Creación de matrices elementales

Los comandos ones, zeros y eye son útiles para crear matrices elementales. La
orden ones(n) devuelve una matriz cuadrada de orden n cuyos elementos son todos iguales
a 1, y ones(m,n) hace lo mismo para una matriz de m filas y n columnas:

» clear
» A=ones(3)
A=
1 1 1
1 1 1
1 1 1
» B=ones (2,3)
B=
1 1 1
1 1 1

Análogamente, tenemos zeros(n) y zeros(m,n), sólo que esta vez todos los
elementos son iguales a cero. Finalmente eye(n) crea la matriz unidad de orden n y
eye(m,n) devuelve una matriz de m filas y n columnas con unos en la "diagonal", siendo
cero el resto de los elementos.
Los comandos rand y randn sirven para generar números aleatorios. rand(n)
devuelve una matriz cuadrada de orden n que tiene como elementos muestras de la
distribución uniforme [0,1] y rand(m,n) hace lo mismo con una matriz rectangular. randn
construye matrices análogas con muestras normales (0,1). Finalmente hilb(n) devuelve la
matriz de Hilbert de orden n, cuyo elemento ocupando la fila r, columna c es 1/(r+c-1).
Muchos problemas lineales implican el manejo de matrices de gran tamaño, en las
que se da la circunstancia que la mayor parte de los elementos son nulos. Esto implica,
eventualmente, el almacenamiento de numerosos ceros y operaciones inútiles. Para resolver
este problema, MATLAB dispone de una función (sparse) que permite prescindir de las

19
cantidades nulas, almacenando la posición (fila y columna) de los elementos no nulos. Un
ejemplo elemental se construye con la matriz unidad:
»clear
» I=eye(1000);
» whos
Name Size Bytes Class

I 1000x1000 8000000 double array

Grand total is 1000000 elements using 8000000 bytes

Observamos que el almacenamiento de I consume aproximadamente 8 Mb.


Determinamos una expresión sparse de I:

» I=eye(1000);
» S=sparse(I);
» whos
Name Size Bytes Class

I 1000x1000 8000000 double array


S 1000x1000 16004 sparse array

Grand total is 1001000 elements using 8016004 bytes

La cantidad necesaria de memoria queda reducida a 16 Kb. La importancia de esta


transformación de la información es que MATLAB trata las matrices sparse de forma
similar a las matrices de formato completo, en lo que se refiere a las operaciones con ellas.
Así, si calculamos el valor de 2*I directamente, resulta

» flops(0)
» II=2*I;
» flops
ans =
1000000

20
Hemos introducido el comando flops, que mide el número de operaciones de coma
flotante en un proceso o durante una sesión. Para el experimento, hemos colocado el
contador a 0 y resulta una cantidad de (obviamente) un millón de operaciones. Haciendo el
mismo cálculo en forma de matriz sparse, resulta

» flops(0)
» SS=2*S;
» flops
ans =
2000

es decir, en este caso un número 500 veces menor de operaciones. En todo caso, siempre es
posible recuperar la matriz con su formato original con la orden full:

» I=eye(1000);
» S=sparse(I);
» II=2*I;
» SS=2*S;
» FS=full(SS);
» whos
Name Size Bytes Class

FS 1000x1000 8000000 double array


I 1000x1000 8000000 double array
II 1000x1000 8000000 double array
S 1000x1000 16004 sparse array
SS 1000x1000 16004 sparse array

Grand total is 3002000 elements using 24032008 bytes

21
1.3 Álgebra Lineal en MATLAB

Si A y B son dos matrices de las mismas dimensiones y a y b dos cantidades


escalares (matrices 1x1), se puede establecer la combinación lineal a*A+b*B:

»clear
» A=[1 2 3;4 5 6];
» B=[7 8 9;0 1 2];
» a=2;b=3;
» C=a*A+b*B
C=
23 28 33
8 13 18
» whos
Name Size Bytes Class

A 2x3 48 double array


B 2x3 48 double array
C 2x3 48 double array
a 1x1 8 double array
b 1x1 8 double array

Grand total is 20 elements using 160 bytes

También es posible una operación de la forma a*A+b. El primer sumando se


interpreta como de costumbre y el segundo añade la cantidad b a todos los elementos de la
matriz a*A. Si A es (m,n), la operación se interpreta com a*A+b*ones(m,n).
Si P es una matriz (m,n) y Q es una matriz (n,r), podemos calcular el producto
PRO=P*Q:

»P=[0 1 2;2 1 0];


» Q=[-1 1 1;1 -1 1;1 1 -1];
» PRO=P*Q
PRO =

22
3 1 -1
-1 1 3

» whos
Name Size Bytes Class

P 2x3 48 double array


PRO 2x3 48 double array
Q 3x3 72 double array

Grand total is 21 elements using 168 bytes

Para matrices cuadradas del mismo orden A y B, las expresiones L=A\B y R=B/A,
siendo A una matriz no singular, pueden sorprender a primera vista, pero se trata
simplemente del producto de la inversa de A por B y de B por la inversa de A,
respectivamente. Esta es una forma sencilla y rápida de resolver (algunos) sistemas lineales,
A*X=B, Y*A=B. Teniendo en cuenta el comando inv, que determina la inversa de ina
matriz no singular, las expresiones A\B y inv(A)*B son equivalentes, y lo mismo sucede
con B/A y B*inv(A).
MATLAB utiliza diferentes métodos para calcular inversas, dependiendo el método
concreto de la estructura de los elementos que constituyen la matriz. Si no existe una
alternativa mejor, los cálculos se llevan a cabo por eliminación gaussiana con pivotación
parcial. Si a es la matriz de un sistema de ecuaciones lineales, el algoritmo se denomina
factorización LU de a. Sea el sistema a*X=b y P la matriz de pivotación. Entonces
P*a*X=P*b. El algoritmo consiste en determinar L (triangular inferior) y U (triangular
superior) tales que P*a=L*U. La matriz original se obtiene entonces como a=P-1*L*U. Con
MATLAB, la expresión [l u p]=lu(a), devuelve las tres matrices L, U y P, respectivamente.
Veamos algunoa ejemplos.

»clear
»A=[0 1;1 0];
» B=[1 2;3 4];
» X=A\B
X=
3 4
1 2
» Y=B/A

23
Y=
2 1
4 3
» a=[-1 1 1;1 -1 1; 1 1 -1];
» b=[1;1;1];
» [l u p]=lu(a)
l=
1 0 0
-1 1 0
-1 0 1
u=
-1 1 1
0 2 0
0 0 2
p=
1 0 0
0 0 1
0 1 0

La eficacia de los métodos para resolver sistemas, depende, además, del número de
condiciòn de la matriz del sistema (aquí A):

número condición(A)=norma2(A)*norma2(A-1)

y MATLAB tiene un comando para calcularla: cond(A). Cuanto mayor es el valor de


cond(A), mayor debe ser la precisión asociada al algoritmo de cálculo. También se puede
diagnosticar la (no) singularidad de la matriz A mediante el cálculo de su determinante, lo
que se puede hacer con el comando det.
Veamos unos ejemplos con la matriz de Hilbert:

» det(hilb(4)),cond(hilb(4))
ans =
1.6534e-007

24
ans =
1.5514e+004
» det(hilb(12)),cond(hilb(12))
ans =
2.8581e-078
ans =
1.7681e+016

Se puede calcular la inversa de la matriz de Hilbert de orden n con la orden


invhilb(n). El resultado es exacto para n menor que 15.

1.4 Funciones elementales con matrices o vectores


como argumentos

Si A es una matriz cualquiera, A' es la matriz transpuesta de A, si tiene elementos


reales, o la transpuesta de la conjungada de A, si tiene elementos complejos. Por otra parte,
A.' es la matriz transpuesta de A en cualquier caso.
Si la matriz A es cuadrada, es posible calcular A*A, A^3, ... ,A^p, ... y por lo tanto
calcular la exponencial de A. Esto se puede hacer con la función expm y MATLAB dispone
de varios métodos numéricos alternativos (help expm):

»A=[0 1;1 0];


» E=expm(A)
E=
1.5431 1.1752
1.1752 1.5431

Si A admite inversa, también es posible determinar A^(p) con p<0. No debe


confundirse expm(A) con exp(A) que también existe en MATLAB, pero se refiere a los
elementos de A.
Análogamente es posible calcular logm(A) y sqrtm(A), logaritmo (matricial) de A,
función inversa de expm y raíz cuadrada matricial de A, respectivamente.
La traza de una matriz cuadrada A es la suma de los elementos de la diagonal
principal. En MATLAB se obtiene con trace(A).

25
Existe un cierto número de funciones que tienen esencialmente vectores, fila o
columna, como argumentos, devolviendo una cantidad escalar. Por ejemplo, max(V) es el
elemento más grande de V y min(V) el más pequeño. Naturalmente, estamos suponiendo
que V es un vector real. Si tiene elementos complejos, vale max(abs(V)) y min(abs(V)). La
orden sort(V) clasifica los elementos de V de menor a mayor y mean(X) devuelve la
media aritmética de los elementos de V. Estas funciones pueden ser aplicadas a matrices
(m,n), operando en este caso por vectores columna y devolviendo un vector fila. Es decir,
si A es (m,n), entonces max(A) es un vector fila cuyos n elementos son los valores
máximos de cada columna de A.

1.5 Operaciones y funciones dirigidas a los elementos de las


matrices

MATLAB permite realizar operaciones aritméticas elemento a elemento y hacer uso


de las funciones elementales pre-definidas, dirigidas a los elementos de las matrices. En el
primer caso, las matrices deben, eventualmente, tener las mismas dimensiones.

Operación Expresión en
MATLAB
Suma A+B
Diferencia A-B
Multiplicación A.*B
División por la izquierda A.\B
División por la derecha A./B
Expresión exponencial A.^B

»clear
» A=[0 1;1 0];
» B=[1 2;3 4];
» A.*B
ans =
0 2
3 0
» A./B

26
ans
0 0.5000
0.3333 0
» B.^A
ans =
1 2
3 1

Las funciones elementales pre-definidas de la tabla incluida en la sección 0.5 son


aplicables a las matrices, operando directamente sobre los elementos.

» clear
» A=[-1 2; 2 -1];
» B=sin(A)
B=
-0.8415 0.9093
0.9093 -0.8415

1.6 Extracción de elementos de vectores y matrices

A continuación veremos cómo extraer listas de elementos de vectores o matrices, en


forma de elementos individuales, vectores o matrices (submatrices). Consideremos una
matriz A (m,n). Si 1≤k1≤m y 1≤k2≤n, el símbolo A(r,c) almacena el elemento de A situado
en la fila r y en la columna c. Para un vector V con n elementos, V(k) designa el elemento
que ocupa la posición k , siendo k≤n. El símbolo (:) se utiliza mucho en este contexto como
símbolo genérico, para representar filas o columnas completas, en la forma que queda de
manifiesto en el cuadro siguiente:

Nombre de la lista de Significado


elementos (bloques)
A(:,c) submatriz columna c de A, 1≤k≤n
A(r,:) submatriz fila r de A, 1≤k≤m
A(:,c1:c2) submatriz construida con todas las columnas de A entre c1
y c2, ambas inclusive

27
A(r1:r2,:) submatriz construida con todas las filas de A entre r1 y r2,
ambas inclusive
A(r1:r2,c1:c2) submatriz construida con las columnas de c1 a c2, ambas
inclusive, de las filas r1 a r2, ambas inclusive
A(:) vector columna construido con los elementos de A
encadenando las columnas sucesivas
A(k1:k2) vector fila construido con los elementos de A(:) desde k1
hasta k2, ambos inclusive
A([k1 k2 ...]) vector fila construido con los elementos k1, k2,..., etc de
la matriz A(:)
A([r1 r2 ...],[c1 c2 ...]) submatriz construida con los elementos de A en las filas
r1, r2,... y en las columnas c1, c2,...
A(:,[c1 c2 ...]) submatriz construida con las columnas c1, c2, etc.
A([r1 r2 ...],:) submatriz construida con las filas r1, r2, etc.

Teniendo en cuenta los símbolos que acabamos de revisar, es posible cambiar


elementos individuales en matrices, filas o columnas completas o bloques de la misma.
Veamos un ejemplo.

» clear
» A=[1 1 0;1 0 1;1 1 0];
» A(2,2)=-5;
» A(3,:)=[-6 -7 -8];
»A
A=
1 1 0
1 -5 1
-6 -7 -8
Los comandos triu(A), tril(A) y diag(A) extraen de la matriz cuadrada A una matriz
triangular superior, triangular inferior y diagonal, respectivamente.

28
1.7 Resumen

De nuevo establecemos un listado alfabético de las nuevas órdenes de MATLAB


comentadas en este capítulo y de nuevo, la recomendación es explorar con la función help
(eventualmente con lookfor) cada una de ellas

con
det
diag
expm
eye
flops
full
hilb
inv
invhilb
length
linspace
logm
lu
max
mean
min
ones
rand
randn
trace
size
sparse
sqrtm
tril
triu
zeros

29

También podría gustarte