Archivo

Entradas Etiquetadas ‘Matlab’

Cronometrar código (matlab)

Miércoles, 27 de Mayo de 2009 blakeyed Sin comentarios

Matlab® es un lenguaje muy utilizado en ingeniería, ya que permite hacer de forma más o menos sencilla cálculos matemáticos muy complejos, y a veces necesitamos procesar gran cantidad de datos y llega a ser desesperante ver cómo tarda sin tener tan siquiera una ligera idea de cuánto queda.

El principio del código que voy a postear se basa en dos funciones: tic y toc. La primera de ellas marca el inicio de la cuenta de tiempo, y la segunda el final, indicándonos los segundos transcurridos entre tic y toc. Podemos por ejemplo hacer esto:

1
2
3
tic
% Tarea que tarda mucho
toc

Y nos devolverá los segundos en total que ha tardado.

Pero vamos a ir algo más allá. Imaginemos que tenemos una tarea iterativa de N iteraciones, queremos que cada N/20 iteraciones nos diga más o menos lo que queda (en cada iteración sería mucho, porque estaría todo el rato diciendo el tiempo, y además gastando tiempo en ello; por lo que tendríamos que esperar mucho más de lo necesario).

Éste es el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
N=2000;

aviso=100;

tic % Inicia el contador de tiempo
for n=0:N

    % Calculamos el progreso total y los tiempos estimado y restante
    if (mod(n, aviso)==0)
        progreso=n/N;       % Progreso (Entre 0 y 1)
        transcurrido=toc;   % Tiempo transcurrido
        estimado=transcurrido/progreso; % Estimamos el tiempo total
        queda = estimado-transcurrido;  % Tiempo restante
        % Lo mostramos todo en pantalla
        disp(sprintf('Progreso %2.2f%%. Tiempo Transcurrido: %ds. Tiempo estimado: %ds. Tiempo restante %ds.', progreso*100, round(transcurrido), round(estimado), round(queda)));    
    end
   
    % Esto se supone que es una tarea que tarda mucho tiempo
    pause(0.01);
end

disp('Completado!');

Texto personalizado en matlab

Martes, 26 de Mayo de 2009 blakeyed Sin comentarios

Cuando trabajamos con Matlab® a la hora de poner los datos de una variable en pantalla, basta con poner la variable (sin ; al final), pero si queremos escribir un texto cualquiera, debemos utilizar disp():

1
disp('Estoy escribiendo un mensaje en matlab');

Pero si queremos intercalar información o escribir nuestras variables de una forma más elegante, debemos utilizar sprintf(), se comporta como el sprintf() de C, y acepta sus \n, \t, %d, %f, %s… incluso podemos formatear la salida como veremos en el ejemplo. Para más información acerca de lo que podemos introducir en la función, es mejor acudir a help.

1
disp(sprintf('El número pi: %1.40f\n', pi));

Esta función combinada con disp(), como vemos arriba, trabaja muy parecido a printf() de C.
Pero,
¿qué hace sprintf() cuando en vez de un número le pasamos una matriz? Insertará todos los elementos seguidos, como si de un número muy largo se tratase.
¿cómo pongo un signo %? disp(sprintf(’%%’));

Categories: General Tags: , , ,

Visita otras webs de la red