Evitando Los Ciclos Repetitivos
-
Upload
brian-williams -
Category
Documents
-
view
230 -
download
0
Transcript of Evitando Los Ciclos Repetitivos
7/21/2019 Evitando Los Ciclos Repetitivos
http://slidepdf.com/reader/full/evitando-los-ciclos-repetitivos 1/3
Matlab
Laboratorio de Programación y Computación Prof. Helfer
1
El comportamiento usual de Matlab puede ser cambiado especificando un formato numérico
diferente dentro del menú File/Preferences o escribiendo el comando FORMAT en la señal de
ingreso de comandos. La tabla siguiente indica el efecto producido al cambiar el formato de
presentación de la razón de variables calculadas como:
>> razon = 610./12razon =
50.8333Matlab Command ratio Comments
format short 50.8333 4 dígitos decimales
format long 50.83333333333334 14 dígitos decimales
format short e 5.0833e+001 4 dígitos decimales más exponente
format long e 5.083333333333334e+001 14 dígitos decimales más exponente
format short g 50.8333 mejor que format short o format short e
(predefinido), cambia cuando ans > 1000
format long g 5.083333333333334e+001 mejor que format long o format long e
format bank 50.83 2 dígitos decimales
format + + escribe el signo +, - o en blanco(cero)
format bank formato fijo para dólares y centavos
format rat formato de salida como una razón(ratio)
format compact formato con salida sin líneas vacías
format loose reestablece la salida con espacios vacíos.
format hex salida con formato hexadecimal
% rqroots: Script para encontrar las raíces cuadráticas
format compact;
% señal de ingreso de los coeficientes
a = input('Ingrese el coeficiente cuadrático a: ');
b = input('Ingrese el coeficiente cuadrático b: ');
c = input('Ingrese el coeficiente cuadrático c: ');
disp('')
% calcula los valores intermedios x & y
x = -b/(2*a);
y = sqrt(b^2-4*a*c)/(2*a);
% calcula y despliega las raíces
s1 = x+y;
disp('Valor de la primera raíz cuadrática: '),disp(s1);
s2 = x-y;
disp('Valor de la segunda raíz cuadrática: '),disp(s2);
7/21/2019 Evitando Los Ciclos Repetitivos
http://slidepdf.com/reader/full/evitando-los-ciclos-repetitivos 2/3
Laboratorio de Programación y Computación Prof. Helfer
2
Evitando los Ciclos Repetitivos
En general, los ciclos repetitivos deben evitarse en Matlab porque pueden aumentar
significativamente el tiempo de ejecución de un programa. Matlab tiene la capacidad de aumentar
dinámicamente el tamaño de vectores y matrices cuando un ciclo repetitivo lo requiera. Por
ejemplo, un vector puede tener una longitud N en la N-ésima ejecución de un ciclo y en la N-ésima+1, Matlab puede aumentar la longitud del vector de N a N+1. Sin embargo, esta localización
dinámica de almacenamiento no está acompañada eficientemente en términos de tiempo de cálculo.
Por consiguiente, considere el siguiente programa para generar una onda sinusoidal:
clear all% sinusoide de longitud 5000ticfor t=1:5000y(t) = sin(2*pi*t/10);
endtoc
Esto da como resultado un escalar t, con un valor final de 5000 y un vector y, una onda sinusoidal
con 10 muestras por ciclo, con 5000 elementos. Cada vez que el comando dentro del ciclo for es
ejecutado, el tamaño de la variable y se aumenta en uno. El tiempo de ejecución en cierta
computadora es 7,91 segundos. Considere ahora este programa:
% sinusoide de longitud 10000ticfor t=1:10000
y(t) = sin(2*pi*t/10);endtoc
Despejando el espacio de trabajo de matlab y corriendo este programa para producir un vector y que
tiene 10000 elementos requiere un tiempo de ejecución en la misma computadora de 28,56
segundos, casi cuatro veces el tiempo de ejecución del primer programa. Forzando a que Matlab
localice memoria para y cada vez que se ejecuta el ciclo for causa que el tiempo de ejecución crezca
geométricamente con la longitud del vector.
Para maximizar la velocidad los arreglos (vectores/matrices) deben ser prelocalizados antes que se
ejecute el ciclo for. Para eliminar la necesidad de aumentar la longitud de y cada vez que se ejecutael ciclo, el programa podría escribirse como:
% sinusoide de longitud 10000 con prelocalización del vectortic
y = zeros(1,10000);for t=1:10000y = sin(2*pi*t/10);
endtoc
En este caso, y fue definido arbitrariamente definido como un vector de longitud 10000, con valorrecalculados en el ciclo repetitivo. El tiempo de cálculo en este caso fue 2,03 segundos. El tiempo
7/21/2019 Evitando Los Ciclos Repetitivos
http://slidepdf.com/reader/full/evitando-los-ciclos-repetitivos 3/3
Laboratorio de Programación y Computación Prof. Helfer
3
de ejecución puede ser disminuído aún más "vectorizando" el algoritmo, aplicando una operación a
un vector completo en vez de un elemento por vez. Aplicando esta aproximación a nuestro ejemplo
de generación del sinusoide:
% mejor método para la generación del sinusoide
tict = 1:10000;y = sin(2*pi*t/10);toc
Este programa produce el vector t con 10000 elementos y luego el vector y con 10000 elementos, el
cual es el mismo y del segundo programa anterior. Sin embargo, usando nuevamente la misma
computadora, este programa se ejecuta en 0,06 segundos opuestamente a los 16,04 segundos que
demoró el ciclo for del segundo programa, o los 1,92 segundos del ciclo for con prelocalización del
vector.