Anda di halaman 1dari 23

Iteration (for-loops)

The MATLAB iteration structure (for-loop) repeats a group of statements a


fixed, predetermined number of times. A matching end closes the
statements.
Repeating then means looping or cycling a process usually with the objective
of approaching a desired goal or target.
Each repetition of the process is called an 'iteration', and the results of
one turn are used as the starting point for the next turn or cycle.
The general format is:
for variable = expression
statement
...
end
Example:

c = 5;
% Preallocate matrix, fill it with zeros
a = zeros(c, c);
for m = 1 : c
for n = 1 : c
a(m, n) = 1/(m + n * 5);
end
end
a

The result is:


a=
0.1667
0.1429
0.1250
0.1111
0.1000

0.0909
0.0833
0.0769
0.0714
0.0667

0.0625
0.0588
0.0556
0.0526
0.0500

0.0476
0.0455
0.0435
0.0417
0.0400

0.0385
0.0370
0.0357
0.0345
0.0333

The semicolon terminating the inner statement suppresses repeated printing,

and the a after the loop displays the final result.


It is a good idea to indent the loops for readability, especially when they are nested.

ren = input('Nmero de renglones: ');


col = input('Nmero de columnas: ');
for r = 1 : ren
for c = 1 : col
s = ['Dato (' num2str(r) ', ' num2str(c) '): '];
m(r, c) = input(s);
end
end
m

Manipulacin bsica de matrices en MatLab


ES FR BR

Mayo 2016

Indice

I. Cmo se almacenan las matrices

II. La indexacin lineal


o

II.1. Acceder a un elemento de una matriz utilizando la indexacin lineal

II.2. Pasar de una indexacin a otra

II.2.1. La funcin ind2sub

II.2.2. La funcin sub2ind

III. La funcin reshape

Consulta tambin:Manipulacion de matrices en matlab

I. Cmo se almacenan las matrices


MatLab almacena vectores y matrices, sin importar su dimensin, como vectores columna.
Por ejemplo, la siguiente matriz:

(2 7 4)
(5 8 3)

es almacenada en un vector columna formado por las columnas de la matriz (una columna
despus de otra).

(2)
(5)
(7)
(8)
(4)
(3)

II. La indexacin lineal


Esta manera de almacenar en MatLab implica que es posible acceder a los elementos de una
matriz con un solo ndice (que va de 1 hasta el nmero total de elementos de la matriz).

II.1. Acceder a un elemento de una matriz utilizando la indexacin lineal


Para el caso de las matrices, acabamos de ver que el vector columna correspondiente estaba
compuesto simplemente por las columnas de la matriz puestas una a continuacin de otra. Sin
embargo, es mas difcil de ver lo que pasa cuando manipulamos matrices de mas
de 2dimensiones.
Veamos el caso particular de una matriz T de tres dimensiones, de 4X2X3. Esta matriz
contiene 24elementos. Si los numeramos del 1 al 24 y consideramos (para mayor claridad)
que una matriz de3 dimensiones es un conjunto de pginas (ltima dimensin) conteniendo
cada una de las matrices (las dos primeras dimensiones), entonces estarn organizadas de
este modo:

Por lo tanto, estos elementos estn organizados en el vector columna que corresponde a la
matriz incrementando el primer ndice de la matriz, luego el segundo, luego el tercero (y los
siguientes si trabajramos con mas de 3 dimensiones).
A continuacin veamos cmo podemos mostrar los elementos de T en el orden en que es
almacenado. En primer lugar, asignemos un valor a T:

T=rand(4,2,3);

En el vector columna correspondiente, los elementos vienen dados en el orden en que son
almacenados por:

for p=1:3
for n=1:2
for m=1:4
disp(T(m,n,p));
end
end
end

Dicho de otro modo, partiendo de un vector columna correspondiente al almacenamiento de


una matriz, este es ordenado en la matriz dividindolo segn la ultima dimensin, luego la

precedente y as sucesivamente. Por lo tanto, la divisin es hacha de esta manera:

Finalmente, en nuestro ejemplo, podemos acceder al dcimo primer elemento de la


matriz T de dos maneras:

T(3,1,2)

T(11)

Tan solo hay que escribir las siguientes lneas para ver que los elementos aparezcan en el
mismo orden como en las 3 bucles imbricadas precedentes.

for q=1:24

disp(T(q));
end

II.2. Pasar de una indexacin a otra


Dependiendo de cada caso, una u otra de las indexaciones puede ser ms prctica. Existen
funciones MatLab que simplifican la manipulacin de esta indexacin:

sub2ind permite pasar de la indexacin lineal a la indexacin mltiple.

ind2sub permite pasar de la indexacin mltiple a la indexacin lineal.

Para obtener ayuda acerca de estas funciones, en la ventana de MatLab escribe help
sub2indohelp ind2sub. Para obtener ayuda mas detallada, escribe doc sub2ind o doc
ind2sub.
En lugar de mostrar el uso de estas funciones en el caso general de una matriz
de N dimensiones, veremos un caso particular.

II.2.1. La funcin ind2sub


Para conocer la indexacin mltiple correspondiente a los ndices 3, 8, 17, 23 de una tabla
de4x2x3 tan solo hay que hacer:

v=[3;8;17;23];
[m n p]=ind2sub([4 2 3],v);

El primer argumento de la funcin ind2sub es el tamao de la matriz a la cual


queremos efectuar la conversin indexacin lineal --> indexacin mltiple.

El segundo argumento v de la funcin ind2sub es el vector de los ndices que


queremos convertir.

El miembro de la izquierda [m n p] recibir los vectores correspondientes a la


indexacin mltiple.

Concretamente, para toda matriz T de 4x2x3 tendremos:


T(m(1),n(1),p(1))=T(v(1))=T(3)
T(m(2),n(2),p(2))=T(v(2))=T(8)
T(m(3),n(3),p(3))=T(v(3))=T(17)
T(m(4),n(4),p(4))=T(v(4))=T(23)

Ahora podremos probar estas lneas:

T=rand(4,2,3);
v=[3;8;17;23];
[m n p]=ind2sub([4 2 3],v);
for q=1:4
disp([T(m(q),n(q),p(q)), T(v(q))]);
end

para ver que hayamos obtenido el resultado esperado.

II.2.2. La funcin sub2ind


Supongamos que queramos convertir en indexacin lineal los multi-ndices (2,2,1), (1,2,3),
(4,1,2), (3,1,3) de una matriz de 4x2x3, entonces ser suficiente hacer:

m=[2;1;4;3];
n=[2;2;1;1];
p=[1;3;2;3];
v=sub2ind([4 2 3],m,n,p);

El primer argumento de la funcin sub2ind es el tamao de la matriz a la cual


queremos efectuar la conversin indexacin mltiple --> indexacin lineal

Los siguientes argumentos son las columnas m, n, p, conteniendo los ndices de la


primera dimensin, los ndices de la segunda dimensin, los ndices de la tercera
dimensin respectivamente.

El miembro de la izquierda v recibir el vector correspondiente a la indexacin lineal.

Concretamente, para toda matriz T de 4x2x3 tendremos:


T(v(1))=T(m(1),n(1),p(1))=T(2,1,1)
T(v(2))=T(m(2),n(2),p(2))=T(1,2,3)
T(v(3))=T(m(3),n(3),p(3))=T(4,1,2)
T(v(4))=T(m(4),n(4),p(4))=T(3,1,3)

Ahora podemos probar estas lneas:

T=rand(4,2,3);
m=[2;1;4;3];
n=[2;2;1;1];
p=[1;3;2;3];
v=sub2ind([4 2 3],m,n,p);
for q=1:4
disp([T(v(q)), T(m(q),n(q),p(q))]);
end

para comprobar que hayamos obtenido el resultado esperado.

III. La funcin reshape


Teniendo en cuenta como se almacena una matriz en MatLab, fcilmente podemos
comprender que el tamao de una matriz no es importante y que solo es necesario una
pequea funcin para dar a una matriz la forma que queramos (siempre que el nmero de
elementos no cambie). La funcin MatLab que permite redimensionar una matriz es reshape.
Como con las otras funciones, para obtener ayuda acerca de esta funcin escribe en la
ventana de MatLab help reshape o doc reshape para obtener ayuda ms detallada.
Para comprender la accin de la instruccin reshape, tan solo debemos saber que
redimensionando una matriz T en una matriz M, los elementos de T son tomados en orden
creciente de su indexacin lineal y son colocados en M en el mismo orden.
Veamos nuevamente el ejemplo de la matriz T precedente (T es de 4x2x3). Como ya lo
hemos dicho, el numero de elementos de esta matriz es 24. Vemos tambin que es el numero
de elementos de una matriz M de 6X4. Esto es lo que ocurre cuando se escribe el siguiente
cdigo:

M=reshape(T,[6 4]);

Cabe mencionar que fcilmente podemos obtener la matriz inicial T con la ayuda
de Mredimensionndola adecuadamente:

TT=reshape(M,[4 2 3]);

La matriz TT es idntica a la matriz T inicial.

For a single input , what you described is sufficient :

>>A=input(' Matrix :\n');


>> % Enter the matrix , example [4 5 6;3 6 9];

For a number of inputs you only need a manifold where to store them, the rigorous way is to use cells :

>>N=10;
>>B=cell(N,1);
>>for n=1:N
fprintf(' Entre matrix %d\n',n);
B{n}=input('');
end

Entrada/salida

Cuando vamos a reservar un vuelo introducimos en el programa la fecha y las


ciudades de origen y destino. El programa informtico nos proporciona las
horas de partida del avin de la ciudad de origen y otra informacin relevante
para el viajero. Se selecciona la fecha en un control del tipo date y las
ciudades de origen y destino en un control de tipo list desplegable ordenadas
alfabticamente.
En MATLAB podemos cambiar el valor de los parmetros de entrada con el
editor de script, guardar de nuevo el script modificado y correrlo. Pero es
mucho ms fcil utilizar el comado input tal como hemos visto al final de la
pgina Variables.
a=input('primer coeficiente, a: ');
str=input('mensaje: ','s');

MATLAB imprime los resultados de los clculos y los guarda bien en una
variable o en ans, si no se especifica. En muchos casos esto es suficiente, pero
en programas ms largos es necesario identificar o describir el resultado de un
determinado clculo. MATLAB dispone de una funcin fprintf muy verstil
para mostrar distintos datos con formato, alternativamente se puede utilizar la
funcin disp.
La funcin disp

La funcin disp de MATLAB se utiliza para mostrar un escalar, un mensaje


(string), un vector o una matriz.
En la lnea de comandos escribimos
>> disp('resultado')
resultado
>> y=22;
>> disp(y)
22
>> x=1:0.5:3;
>> disp(x)
1.0000
1.5000
2.0000
>> A=[1 2 3; 4 5 6; 7 8 9];
>> disp(A)
1
2
3
4
5
6
7
8
9

2.5000

3.0000

La funcin disp imprime una matriz A, vamos a ver ahora como imprime una
tabla de valores (abscisa, ordenada). Creamos el script prueba.

x=0:5 %vector fila


y=3*x.^2-5 %vector fila
res(:,1)=x'; %columna 1 de la matriz
res(:,2)=y'; %columna 2 de la martiz
%esto es equivalente a poner res=[x' y']
disp('tabla funcin')
disp('abscisa
ordenada')
disp(res)

En la ventana de comandos corremos el script prueba


>> prueba
x =
0
1
2
y =
-5
-2
7
tabla funcin
abscisa
ordenada
0
-5
1
-2
2
7
3
22
4
43
5
70

22

43

70

La funcin fprintf

Es otra funcin para mostrar un mensaje o un resultado, pero que permite


mezclar texto y valores numricos de las variables y tambin se puede ajustar
el formato de los nmeros. Esta funcin tiene muchas posibilidades por lo que
empezaremos con las ms sencillas.
fprintf('texto %5.2f texto adicional', variable)
En medio del texto se ha intercalado un valor numrico que contiene una
variable con el formato %-5.2f,

% es el smbolo que indica formato

-, alinea el nmero hacia la izquierda

+, imprime el signo (+ si es positivo y - si es negativo)

0, aade ceros

5, indica cinco caracteres que es el ancho del campo donde


ese imprime el valor numrico, si el nmero es ms corto se
aaden espacios o ceros delante del nmero.

2, indica la precisin, indica el nmero de dicimales que se


mostrarn a la derecha del punto decimal

f, indica que se utilizar la notacin (entero.decimal) por


ejemplo 17.09

e, indica que se utilizar la notacin exponencial, por


ejemplo1.709e+001

i, indica entero

g, formato corto

Vamos a calcular el alcance de un proyectil disparado con velocidad de 46.325


m/s haciendo un ngulo de 32 mediante la siguiente frmula.
x=v20sin(2)gx=v02sin(2)g

Escribimos el script prueba para probar la funcin fprintf


ang=32;
v0=46.325;
x=v0*v0*sind(2*ang)/9.8;
fprintf('velocidad %2.4f m/s, ngulo de tiro %i, alcance %5.2f
m\n',v0,ang,x)

El carcter \n al final del texto en la funcin fprintf indica una nueva lnea,
probar el efecto al quitarlo. Las variables que guardan los datos v0, ang y x se
ponen al final en el mismo orden que se citan en el texto separadas por comas.
Se sugiere al lector que pruebe otros formatos
Corremos el script en la ventana de comandos
>> prueba
velocidad 46.3250 m/s, ngulo de tiro 32, alcance 196.82 m

La funcin sprintf

La funcin sprintf es similar a printf salvo que imprime en una variable. Se


utiliza en combinacin con la funcin grfica text para mostrar valores de una
variable en un grfico
%cdigo para dibujar un grfico

plot(Vr,Pr,'r')
text(1,1.35,sprintf('presin %1.3f',p))

Vamos a ver como funciona en la ventana de comandos. Guardamos el valor


que imprime sprintf en la variablestr.
>> str=sprintf('el valor de pi es %1.3f',pi)
str =
el valor de pi es 3.142

Al final de fprintf se pone el carcter \n que indica una nueva lnea, no es


necesario en la funcin sprintf

Matrices
Una matriz A de m filas y n columnas o de
dimensin mn se representa por
A=a11a21...am1a12a22...am2............a1na2n...amn
A=[a11a12...a1na21a22...a2n............am1am2...amn]

Para acceder a un elemento situado en la fila i y en la


columna j, Aij, se escribe A(i,j). La funcin size devuelve
dos nmeros que corresponden a las dimensiones de la
matriz.
La matriz traspuesta A' de la matriz A consiste en
intercambiar filas por columnas: La primera columna de
la matriz A es la primera fila de la matriz traspuesta A', la
segunda columna de la matriz A se convierte en segunda
fila de la matriz A', y as sucesivamente. La dimensin de
la matriz tarspuesta A' es nm, es decir n filas
y mcolumnas
A'=a11a12...a1na21a22...a2n............am1am2...amn
A'=[a11a21...am1a12a22...am2............a1na2n...amn]

Creacin de una matriz


Se puede crear una matriz de 32, y asignar a la
variable A de dos formas distintas

>> A=[1 2 3
4 5 6];
>> A=[1 2 3; 4 5 6]
A =
1
2
3
4
5
6
>> A(2,2) %accede al elemento situado en la fila 2
columna 2
ans = 5
>> size(A) %dimensiones de la matriz A (2 filas, 3
columnas)
ans = 2
3
>> B=A' % B es la matriz traspuesta de A
B =
1
4
2
5
3
6
>> size(B)
ans =
3
2

Se puede crear una matriz a partir de vectores o a partir


de otras matrices
>> x1=[1,2,3]; %vectores fila
>> x2=[4,5,6];
>> A=[x1;x2]
A =
1
2
3
4
5
6
>> x1=[1;2;3]; %vectores columna
>> x2=[4;5;6];
>> A=[x1,x2]
A =
1
4
2
5
3
6
>> X=[1,2,3;4,5,6]
X =
1
2
3
4
5
6
>> Y=[7,8,9;10,11,12;13,14,15]
Y =
7
8
9
10
11
12
13
14
15
>> A=[X;Y]
A =
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

La funcion repmat crea una matriz B compuesta de la


repeticin de nm copias de A.

>> A=[1,2;3,4];
>> B=repmat(A,3,2)
B =
1
2
1
3
4
3
1
2
1
3
4
3
1
2
1
3
4
3

2
4
2
4
2
4

Una matriz se puede convertir en un vector columna


>> A=[1,2,3;4,5,6];
>> X=A(:)
X =
1
4
2
5
3
6

Un vector se puede convertir en una matriz diagonal


mediante diag.
>> x=[1,2,3];
>> A=diag(x)
A =
1
0
0
2
0
0

0
0
3

Matrices predefinidas
La funcin zeros(m,n) crea una matriz de
dimensin mn cuyos elementos son todos ceros
La funcin ones(m,n) crea una matriz de
dimensin mn cuyos elementos son todos unos
La funcin eye(n) crea una matriz cuadrada de
dimensin nn en la cual, los elementos de la diagonal
son unos y el resto de los elementos son ceros, es decir,
crea la matriz identidad de dimensin n.
Por ejemplo, zeros(n) reserva espacio para una matriz
cuadrada de dimensin nn.Lo mismo ocurre con ones(n)
>> y=zeros(3)
y =
0
0

0
0
0
0
>> y=zeros(3,1)
y =
0
0
0
>> eye(3)
ans =
1
0
0
1
0
0

0
0

0
0
1

Acceso a los elementos de una matriz


Existen tambin varias formas de acceder a ms de un
elemento de una matriz mediante el operador dos
puntos :. Sea la matriz A.
15913261014371115481216(12345678910111213
141516)

A(:,2) se accede a los elementos de la columna 2


A(:,end) se accede a los elementos de la ltima columna
A(3,:) se accede a los elementos de la fila 3
A(1:3,2:4) se refiere a la submatriz de filas de la 1 a la 3 y
de columnas de la 2 a la 4
>> A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A =
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>> A(:,2)
ans =
2
6
10
14
>> A(3,:)
ans =
9
10
11
12
>> A(1:3,2:4)
ans =
2
3
4
6
7
8
10
11
12

Para acceder a los elementos de la matriz sobreados en la


figura escribiremos

>> A=[1,2,3,4;5,6,7,8;9,10,11,12];
>> A([1,2],3)
ans =
3
7
>> A(2,[2,3,4])
ans =
6
7
8
>> A([2,3],2:4)
ans =
6
7
8
10
11
12

Se pueden eliminar elementos a una matriz A y luego


volverlos a aadir
>> A(4,:)=[]
A =
1
2
5
6
9
10

3
7
11

4
8
12

>> A(4,:)=13:16
A =
1
2
3
5
6
7
9
10
11
13
14
15

4
8
12
16

Se puede crear una matriz a partir de vectores columna,


por ejemplo para crear una tabla de valores (abscisa,
ordenada) de una funcin. Se puede calcular la suma de
valores, el valor mximo, mnimo, etc de cada columna,
tal como lo hicimos con los vectores en la pgina anterior.
>> x=0:5; %vector fila
>> y=3*x.^2-5; %vector fila
>> tabla=[x' y']
tabla =
0
-5

1
-2
2
7
3
22
4
43
5
70
>> size(tabla) %matriz de 6 filas y 2 columnas
ans =
6
2
>> max(tabla(:,2))
ans =
70
>> min(tabla(:,2))
ans =
-5
>> sum(tabla(:,2))
ans =
135

Creamos una tabla de cuadrados del nmero entero n, n2 y


de potencias de 2 elevado a la n, 2n del siguiente modo
>> n=[0:5]';
>> potencias=[n n.^2 2.^n]
potencias =
0
0
1
1
1
2
2
4
4
3
9
8
4
16
16
5
25
32

En la pgina titulada Valores y vectores


propios tendremos ocasin de practicar con matrices,
vectores, extraer una matriz o un vector de otra matriz,
crear una matriz a partir de vectores, etc

Operaciones con matrices


Suma de matrices de la misma dimensin
A=[a11a21a12a22a13a23]
B=[b11b21b12b22b13b23]A+B=[(a11+b11)(a21+b21)
(a12+b12)(a22+b22)(a13+b13)
(a23+b23)]A=[a11a12a13a21a22a23]
B=[b11b12b13b21b22b23]A+B=[(a11+b11)(a12+b12)(a13+b13)
(a21+b21)(a22+b22)(a23+b23)]

Como ejercicio se sugiere comprobar el resultado de la


suma de dos matrices
Producto de dos matrices
Se pueden multiplicar matrices de dimensiones (m, k)
(k, n) para obtener una matriz de dimensin (m, n).
A=[a11a21a12a22a13a23]
B=b11b21b31b12b22b32A*B=[(a11b11+a12b21+a13b3
1)(a21b11+a22b21+a23b31)(a11b12+a12b22+a13b32)

(a21b12+a22b22+a23b32)]A=[a11a12a13a21a22a23]
B=[b11b12b21b22b31b32]A*B=[(a11b11+a12b21+a13b31)
(a11b12+a12b22+a13b32)(a21b11+a22b21+a23b31)
(a21b12+a22b22+a23b32)]
>> A=[1 2 3;4 5 6]
A =
1
2
3
4
5
6
>> B=[1 2; 3 4; 5 6]
B =
1
2
3
4
5
6
>> A*B
ans =
22
28
49
64

Producto escalar de dos vectores


Dos vectores se pueden multiplicar si tienen el mismo
nmero de elementos n, uno de ellos es un vector fila de
dimensin 1n y el otro es un vector columna de
dimensin n1, el resultado es una matriz de dimensin
11, es decir un escalar.
A=[a1a2a3]
B=b1b2b3A*B=[a1b1+a2b2+a3b3]A=[a1a2a3]
B=[b1b2b3]A*B=[a1b1+a2b2+a3b3]

Como vemos esta operacin corresponde al producto


escalar de dos vectores, que MATLAB puede realizar
tambin con la funcin dot.
El producto de un vector columa m1 por un vector fila
1m, del mismo nmero de elementos m nos da una
matriz cuadrada de dimensin mm.
Como ejercicio se sugiere comprobar el resultado del
producto A*B y B*A, siendo A un vector fila y B un
vector columna del mismo nmero de elementos.
Producto de un escalar por una matriz
Cuando una matriz se multiplica por un nmero, cada
elemento de la matriz se multiplica por dicho nmero
A=[a11a21a12a21a13a23]k*A=[ka11ka21ka12ka21ka13k
a23]A=[a11a12a13a21a21a23]k*A=[ka11ka12ka13ka21ka2
1ka23]

La operacin kA es commutativa, se obtiene el mismo


resultado haciendo el producto Ak
Operaciones elemento a elemento
Existen muchas situaciones en las que se requieren
operaciones elemento a elemento similares a las que se
lleva a cabo con la suma o la diferencia de dos matrices
de las mismas dimensiones.
A=a11a21a31a12a22a32a13a23a33
B=b11b21b31b12b22b32b13b23b33A.*B=a11b11a21
b21a31b31a12b12a22b22a32b32a13b13a23b23a33b33A./B=
a11/b11a21/b21a31/b31a12/b12a22/b22a32/b32a13/b13a23/b2
3a33/b33A.^n=(a11)n(a21)n(a31)n(a12)n(a22)n(a32)n(

a13)n(a23)n(a33)nA=[a11a12a13a21a22a23a31a32a33]
B=[b11b12b13b21b22b23b31b32b33]A.*B=[a11b11a12b12a13b
13a21b21a22b22a23b23a31b31a32b32a33b33]A./B=[a11/b11a1

2/b12a13/b13a21/b21a22/b22a23/b23a31/b31a32/b32a33/b33]A.
^n=[(a11)n(a12)n(a13)n(a21)n(a22)n(a23)n(a31)n(a32)n(a33)n]
>> A=[1,2,-4;7,0,5];
>> B=[-6,12,-5;-2,16,15];
>> A.*B
ans =
-6
24
20
-14
0
75
>> A.^2
ans =
1
4
16
49
0
25
>> A./B
ans =
-0.1667
0.1667
0.8000
-3.5000
0
0.3333

Energas Renovables EUITI de Eibar

Anda mungkin juga menyukai