miércoles, 28 de mayo de 2014

Números primos en MATLAB


Un número primo es un entero mayor a uno que únicamente tiene dos divisores: la unidad y el número mismo. A excepción del 2, el resto de número primos son impares.

MATLAB dispone de la función nativa isprime para determinar si un número es primo, devolviendo un valor lógico verdadero en caso de serlo y falso en caso contrario. Por ejemplo:

>> isprime(11)

ans =

     1

Ahora, la idea es crear por nosotros mismos un algoritmo sencillo que determine si un número es primo. Para ello optaremos por hacer lo siguiente: sea $n$ el número a verificar, entonces crearemos un vector cuyos términos sean todos los enteros positivos en el intervalo $[1,n]$, enseguida mediante una sentencia de control if verificar mediante la función rem si cada uno de los componentes del vector es divisor de $n$, recuerde que rem devuelve un cero si el segundo argumento es divisor del primero y un número mayor a cero si no lo es. Véase el código resultante de lo que se ha descrito:

n=input('Introduzca un número: ');
L=1:n;
ifnnz(rem(n,L)==0)==2
    disp('Número primo');
else
    disp('Número no primo');
end


martes, 27 de mayo de 2014

Trazar polígonos en MATLAB


La siguiente función permite trazar un polígono de N lados, siendo los argumentos de entrada el número de lados, el radio de la circunferencia en la cuál el polígono se encuentra inscrito, y las coordenadas del centro del polígono.

function h=poligono(N,r,cx,cy)
% Traza un polígono de N lados
t = (1/(2*N):1/N:1)*2*pi;
x = r*sin(t)+cx;
y = r*cos(t)+cy;
h=fill(x,y,'r');
axis square;
end

Enseguida se muestra un ejemplo para el polígono de 6 lados (hexágono):

>> poligono(6,1,0,0);


El usuario puede además hacer adecuaciones a la visualización del polígono utilizando el handles del mismo.


martes, 13 de mayo de 2014

Personalizar Push Button en una GUI MATLAB


Cuando se crea un Push Button en una GUI MATLAB existen ciertas limitaciones para personalizar la visualización del mismo. De forma ordinaria se puede modificar el color de fondo mediante la propiedad BackgroundColor, el tamaño de fuente con FontSize, el estilo de fuente con FontWeight, el tipo de fuente con FontName, e incluso poner una imagen de fondo (Véase este post ). No obstante utilizando las bondades del lenguaje HTML se puede disponer de mayores opciones, enseguida se tratarán algunas de las características más importantes que pueden modificarse.

Colocar letras griegas 

En ingeniería es muy común el uso del alfabeto griego para representar diversas magnitudes. Para colocar letras griegas en el "String" del Push Button deben utilizarse las etiquetas HTML y anteponer un ampersand (&) al nombre de la letra griega. Por ejemplo si requiere utilizar la siguiente expresión: $Calcular\,\,\,\beta$, entonces deberá modificar el "String" como se muestra enseguida:

str='<html>Calcular &beta</html>';
set(hPB,'String',str);


En las líneas anteriores hPB es el handle del Push Button (en un Push Button creado con GUIDE se utilizar la referencia handles.tagBoton).


Subíndices y superíndices

En HTML se utilizan las etiquetas <sub></sub> para indicar un subíndice y <sup></sup> para superíndices. Claro, como en el caso anterior estas deben ir entre etiquetas HTML para que MATLAB lo reconozca como tal, véase el siguiente ejemplo en el cual se utiliza como "String" la expresión: $a^2+b^2=k_0$

str='<html>a<sup>2</sup>+b<sup>2</sup>=k<sub>0</sub></html>';
set(hPB,'String',str);



Múltiples líneas

Para colocar más de una linea en un Push Button puede utilizarse la etiqueta HTML de salto de línea <br>, véase el ejemplo a continuación:

str='<html>Primera línea <br> Segunda línea</html>';
set(hPB,'String',str);




Para una referencia más completa acerca de las características HTML vistas en este post puede visitar los siguientes enlaces:


Gráficas de barras


Las gráficas de barras es una forma de representar gráficamente un conjunto de datos o valores y está conformado por barras rectangulares de longitudes proporcionales a los valores representados.

Para nuestro ejemplo utilizaremos la información proporcionada por la siguiente tabla:

ASIGNATURA
CALIFICACIÓN
Álgebra
9
Geometría
9.5
Cálculo
10
Estática
8.5
Química
8

MATLAB proporciona la función bar para trazar gráficas de barras, que en su sintaxis más simple sólo necesita como argumento un vector con los datos a graficar, véase el ejemplo a continuación:

calificaciones=[9,9.5,10,8.5,8];
bar(calificaciones);


Lo anterior resulta muy sencillo, pero aún carece de información acerca de los datos que se están mostrando. Para añadir una etiqueta a cada dato o barra que se grafica modificaremos la propiedad XTickLabel del axes al cuál pertenece el diagrama de barras, en nuestro ejemplo esas etiquetas serían el nombre de cada asignatura. Definimos las etiquetas utilizando un cell array, veáse el ejemplo:

asignaturas={'Álgebra','Geometría','Cálculo','Estática','Química'};
calificaciones=[9,9.5,10,8.5,8];
h=bar(calificaciones);
set(gca,'XTickLabel',asignaturas);


Modificar el ancho y color de las barras.

Para modificar el ancho de las barras basta con pasar como segundo argumento de la función bar un valor escalar entre 0 y 1, la sintaxis sería:

bar(X,k);

Donde X es el vector que contiene los valores y k un escalar en el intervalo 0 a 1.

Por defecto MATLAB utiliza el color azul para las gráficas de barras, pero existe la posibilidad de cambiar el color a conveniencia del usuario. Para ello puede especificarse el color como un segundo argumento de la función bar, mediante un especificador de color ('r','g','b','k',...), con la sintaxis:

bar(X,'color');

Donde X es el vector de valor y 'color' el especificador de color mediante caracteres. 

Si requiere modificar el grosor y color a la vez, puede usar la siguiente sintaxis:

bar(X,k,'color');

El siguiente ejemplo muestra una gráfica de barras con el ancho y color modificados:


asignaturas={'Álgebra','Geometría','Cálculo','Estática','Química'};
calificaciones=[9,9.5,10,8.5,8];
bar(calificaciones,0.4,'r');
set(gca,'XTickLabel',asignaturas);
title('Calificaciones');


Gráficas de barras múltiples.

En ocasiones se necesita representar más de un valor asociado a una misma característica, para ello es posible graficar diagramas de barras utilizando matrices en lugar de un vector, en donde cada fila proporciona los valores de una misma característica y cada columna pertenece a una categoría distinta entre los valores. Para nuestro ejemplo utilizaremos la tabla mostrada enseguida.

ALUMNO
CALIFICACIONES
MATEMÁTICAS
FÍSICA
QUÍMICA
Ana
10
7
9
Jorge
8
8
10
Javier
9
9
8


En la tabla anterior cada alumno tiene tres calificaciones asociadas en diferentes asignaturas. El siguiente ejemplo muestra cómo trazar la gráfica de barras correspondiente:


nombres={'Ana','Jorge','Javier'};
Ana=[10,7,9];
Jorge=[8,8,10];
Javier=[9,9,8];
bar([Ana;Jorge;Javier]);
set(gca,'XtickLabel',nombres);


lunes, 12 de mayo de 2014

Visualizador de imágenes


La siguiente GUI hace la función de un visualizador de imágenes, seleccionando una carpeta en la cual estén situadas las imagenes.

function verImg
clearvars('-global')
figure('MenuBar','none',...
    'NumberTitle','off',...
    'Name','Visualizador de imágenes',...
    'Resize','off',...
    'Position',[200 200 450 350]);
centerfig;

uimenu('Label','Seleccionar carpeta','Callback',@selFcn);

ax=axes('units','pixels',...
    'Position',[25 25 400 300],...
    'Visible','off');

uicontrol('style','push',...
    'String','<<',...
    'Position',[0 165 20 20],...
    'Callback',@cambiar);

uicontrol('style','push',...
    'String','>>',...
    'Position',[430 165 20 20],...
    'Callback',@cambiar);

    function selFcn(src,~)
        global carp Imgs cont
        cont=1;
        carp=uigetdir;
        if isequal(carp,0)
            return;
        end
        Imgs=dir([carp,'/*.jpg']);
        imshow(imread([carp,'/',Imgs(cont).name]));
    end

    function cambiar(src,~)
        global carp cont Imgs
        if (strcmp(get(src,'str'),'>>') && cont<length(Imgs))
            cont=cont+1;
            imshow(imread([carp,'/',Imgs(cont).name]));
        elseif (strcmp(get(src,'str'),'<<') && cont>1)
            cont=cont-1;
            imshow(imread([carp,'/',Imgs(cont).name]));
        end
    end
end




Sucesión de Fibonacci en MATLAB


La sucesión de Fibonacci es una sucesión infinita de números naturales, cuyos términos resultan de la suma de los dos términos anteriores. Los primeros dos términos son 1 y 1, y enseguida el resto siguen el patrón descrito con anterioridad, así, algunos de los primeros términos se muestran enseguida:

$$1,1,2,3,5,8,13,21,34,55,...$$

Luego, cada término de la sucesión se calcula bajo la siguiente especificación: $f_i=f_{i-1}+f_{i-2}$. La implementación en MATLAB resulta muy sencilla, primero definiéndose los dos primeros términos y enseguida concatenar los que siguen el patrón mencionado mediante un bucle. Un código de ejemplo se muestra a continuación:

n=input('¿Cuántos términos necesita? ');
F=[1 1]; % Primeros dos términos de la sucesión
for i=3:n
    F=[F F(i-1)+F(i-2)];
end
disp(F);







miércoles, 7 de mayo de 2014

Personalizar un msgbox


Para comenzar, un msgbox es un elemento gráfico utilizado para enviar mensajes al usuario, por ejemplo una sugerencia, un mensaje de advertencia o error. La sintaxis más simple para crear un msgbox es la siguiente:

msgbox('Mensaje','Título de la ventana');

Con la sintaxis anterior se muestra un msgbox con características ordinarias y establecidas por defecto, como el que se muestra enseguida:



La función msgbox no cuenta con argumentos de entrada que sirvan para especificar una apariencia diferente del cuadro de diálogo mostrado. Pero existe la posibilidad de personalizar un msgbox accediendo mediante referencias (handles) a sus componentes gráficos elementales.

Modificando el color de la ventana

Es evidente que la ventana gráfica de un msgbox es un elemento figure y por tanto pueden modificarse sus propiedades como tal; para ello debe utilizarse el handle del msgbox como argumento de la función set, véase el ejemplo mostrado enseguida:

h=msgbox('MATLAB TYP','V1');
set(h,'color','g'); % Establece color verde para la ventana



Modificando el tamaño, estilo y tipo de fuente.

Para configurar las propiedades del mensaje que se muestra debemos acceder a la referencia del edit text que lo contiene; utilizando la función allchild se obtienen todos los elementos gráficos "hijos" del objeto pasado como argumento, por ejemplo para el msgbox en cuestión:

h=msgbox('MATLAB TYP','V1');
ch = allchild(h);

La función allchild nos devuelve simplemente las referencias o handles de los objetos pero no indica el tipo de los mismos, para identificar el tipo de objeto gráfico puede utilizarse la función get como sigue:

>> get(ch,'type')

ans = 

    'axes'
    'uicontrol'

El objeto uicontrol es el botón mostrado en el msgbox, y el axes es el elemento que contiene al edit text que nos interesa; para obtener el handle del edit text podemos utilizar la función get como se muestra enseguida:

txt=get(ch(1),'children')

Con la  linea anterior se obtiene y guarda en la variable txt el handle del objeto "hijo" del axes, que en este caso es el edit text. Ahora, una vez que se dispone de la referencia, pueden modificarse las propiedades del edit text de forma ordinaria con la función set, en nuestro caso modificaremos específicamente la propiedad tamaño (FontSize), estilo (FontWeight) y tipo (FontName), véase el ejemplo siguiente:

h=msgbox('MATLAB TYP','V1');
ch = allchild(h);
txt = get(ch(1),'children');
set(txt,'FontSize',12,'FontName','Berlin Sans FB','FontWeight','bold');




Modificando el texto mostrado en el botón

El botón de un msgbox muestra por defecto un "OK", pero claro, es posible modificarlo y adaptarlo a las necesidades del usuario. Se mencionó con anterioridad que una de las referencia obtenidas y guardadas en la variable ch pertenecía al botón, entonces, para modificar el mensaje utilizamos esa referencia en la función set y configuramos la propiedad String como se muestra a continuación:

h=msgbox('MATLAB TYP','V1');
ch = allchild(h);
set(ch(2),'String','Cerrar');