lunes, 23 de septiembre de 2013

Curso Básico de GUI en MATLAB


En nuestro canal de YouTube podrás encontrar un curso en vídeo para iniciarte en el desarrollo de interfaces gráficas en MATLAB utilizando el entorno de desarrollo (GUIDE). El curso completo consta de 12 vídeos en los cuales se ejemplifican los usos comunes de cada uno de los elementos y además de cómo añadir ciertos elementos complementarios a una GUI.

En el siguiente link podrás acceder a la lista de reproducción en YouTube del curso.


A continuación os dejo la inserción del primer vídeo de la serie:


viernes, 20 de septiembre de 2013

Factorial de un número


MATLAB dispone de una función propia para calcular el factorial de un número, la cual es nombrada propiamente como factorial.

Ahora veremos dos maneras de cómo implementar nuestra propia función que calcule el factorial de un número entero dado.

function x=ffactorial(N)
if N<0
    error('Ingrese un entero positivo');
end
k=1;
x=1;
while k<=N
    x=k*x;
    k=k+1;
end
end


function x = mifact(N)
if N<0
    error('Ingrese un entero positivo');
end
if N==0
    x=1;
else
    x=N*mifact(N-1);
end
end

Cómo puede observarse la forma de proceder es un tanto diferente. La segunda función implica la aplicación de un concepto básico y muy útil en  programación, la recursividad, que implica un llamado a la función misma dentro del cuerpo de ésta.

lunes, 16 de septiembre de 2013

Conversión de Número a Letra (Formato de Precio en Letras)


La siguiente función "num2letras" permite convertir un número desde 1 hasta 999 999 a letras. La forma de llamarla es, por ejemplo:

>>L=num2letras(13243.25)

L =

TRECE MIL DOSCIENTOS CUARENTA Y TRES PESOS 25/100 M.N.


functionres=num2letras(cantidad)
% @Jorge De Los Santos
% Ejemplo:  C=num2letras(2143.45)
% C =
% DOS MIL CIENTO CUARENTA Y TRES PESOS 45/100 M.N.
if~isnumeric(cantidad)
    error('Inserte un valor numérico');
end
uni={'','UN','DOS','TRES','CUATRO','CINCO','SEIS','SIETE','OCHO','NUEVE'};
unisp={'DIEZ','ONCE','DOCE','TRECE','CATORCE','QUINCE','DIECISEIS','DIECISIETE','DIECIOCHO','DIECINUEVE'};
dec={'','DIEZ','VEINTE','TREINTA','CUARENTA','CINCUENTA','SESENTA','SETENTA','OCHENTA','NOVENTA'};
decsp={'VEINTE','VEINTIUN','VEINTIDOS','VEINTITRES','VEINTICUATRO','VEINTICINCO','VEINTISÉIS','VEINTISIETE','VIENTIOCHO','VEINTINUEVE'};
cen={'','CIENTO','DOSCIENTOS','TRESCIENTOS','CUATROCIENTOS','QUINIENTOS','SEISCIENTOS','SETECIENTOS','OCHOCIENTOS','NOVECIENTOS'};
N=floor(cantidad);
S=num2str(N);
L=length(S);
if N<10
    res=getuni(num2str(N));
elseif N>9 & N<100
    if S(L-1)=='1';
        res=horzcat(getdec(num2str(N)),getuni(num2str(N)));
    elseif S(L-1)=='2'
        res=horzcat(getdec(num2str(N)));
    elseif S(L)=='0'
        res=horzcat(getdec(num2str(N)),' ',getuni(num2str(N)));
    else
        res=horzcat(getdec(num2str(N)),' Y ',getuni(num2str(N)));
    end
elseif N>99 & N<1000
    if S(L-1)=='1'
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)),' ',getuni(num2str(N)));
    elseif S(L-1)=='2'
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)));
    elseif S(L-1)=='0' | S(L)=='0'
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)),' ',getuni(num2str(N)));
    else
        res=horzcat(getcen(num2str(N)),' ',getdec(num2str(N)),' Y ',getuni(num2str(N)));
    end
elseif N>999 & N<1000000
     if S(L-1)=='1'
        res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)));
     elseif S(L-1)=='2'
        res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)));
     elseif S(L-1)=='0' | S(L)=='0'
         res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)),' ',getuni(num2str(N)));
     else
        res=horzcat(getmil(num2str(N)),' MIL ',getcen(num2str(N)),' ',getdec(num2str(N)),' Y ',getuni(num2str(N)));
     end
end


    function u=getuni(num)
        ifstr2num(num)>9 & num(length(num)-1)=='1'
                u='';
        else
            uu=num(length(num));
            u=cell2mat(uni(str2num(uu)+1));
        end
    end
    function d=getdec(num)
        dd=num(length(num)-1);
        ddu=num(length(num));
        if dd=='1'
            d=cell2mat(unisp(str2num(ddu)+1));
        elseif dd=='2'
            d=cell2mat(decsp(str2num(ddu)+1));
        else
            d=cell2mat(dec(str2num(dd)+1));
        end
    end
    function c=getcen(num)
        ifstr2num(num)==100 || (num(length(num))=='0'&num(length(num)-1)=='0'&num(length(num)-2)=='1'),c='CIEN';
        else
        cc=num(length(num)-2);
        c=cell2mat(cen(str2num(cc)+1));
        end
    end
    function m=getmil(num)
        fori=1:length(num)-3
            B(i)=num(i);
        end
        l=length(B);
        A=str2num(B);
        if A<10
            m=getuni(num2str(A));
        elseif A>9 & A<100
            if B(l-1)=='1';
                m=horzcat(getdec(num2str(A)),getuni(num2str(A)));
            elseif B(l-1)=='2'
                m=horzcat(getdec(num2str(A)));
            elseif B(l)=='0'
                m=horzcat(getdec(num2str(A)),' ',getuni(num2str(A)));
            else
                m=horzcat(getdec(num2str(A)),' Y ',getuni(num2str(A)));
            end
        elseif A>99 & A<1000
            if B(l-1)=='1'
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)));
            elseif B(l-1)=='2'
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)));
            elseif B(l-1)=='0' | B(l)=='0'
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)),' ',getuni(num2str(A)));
            else
                m=horzcat(getcen(num2str(A)),' ',getdec(num2str(A)),' Y ',getuni(num2str(A)));
            end
        end
    end

%% Parte fraccionaria
c=cantidad-floor(cantidad);
c=num2str(roundn(c,-2));
for k=1:100
    s=strcat(num2str(k/100));
    cent=strcat(num2str(k),'/100 M.N.');
    if strcmp(c,s)==1,break,end;
end

res=horzcat(res,' PESOS ',cent); % Conversión final
end

Animación Péndulo Simple


La siguiente función permite simular el movimiento de un péndulo simple.

function anim_pendulo
% @Jorge De Los Santos
f=figure('NumberTitle','off','name','Péndulo simple','MenuBar','none','color',[1 1 1]);
g=9.81; %Constante de aceleración de la gravedad
L=1; % Longitud
%% Solver de la ED
[t,y]=ode45(@psimple,[0 4*pi*sqrt(L/g)],[0 pi/4]);
% Condición inicial -> theta=pi/4
x1=cos(y(:,2));
y1=sin(y(:,2));
t_anim=length(t);
vx=[0 0];
vy=[0 0];
mx=0.04*cos(0:0.1:2*pi);
my=0.04*sin(0:0.1:2*pi);
hold on
plot([-0.2 0.2],[0 0],'k','linewidth',6); %Dibuja el "soporte" del péndulo
m=fill(my,mx,[1 0 0]); % Dibuja círculo.
h=plot(vy,vx,'linewidth',2); % Dibuja la línea de longitud del péndulo.
%% Animación
for i=1:t_anim
    axis([-1.1 1.1 -1.6 0]);
    set(h,'xdata',[0 y1(i)],'ydata',[0 -x1(i)]);
    set(m,'xdata',my+y1(i),'ydata',mx-x1(i));
    plot(y1(i),-x1(i),'-mo','Markersize',1);
    set(gca,'visible','off');
    drawnow;pause(0.1);
end

%% Sistema de Ecuaciones diferenciales del péndulo simple
    function dy=psimple(t,y)
        g=9.81;
        L=1;
        dy=zeros(2,1);
        dy(1)=y(2); % Sistema de Ecuaciones diferenciales
        dy(2)=-(g/L)*sin(y(1)); % de primer orden
    end

end



sábado, 14 de septiembre de 2013

Establecer una contraseña de acceso para una GUI


En este ejemplo veremos un ejemplo sencillo de cómo establecer una contraseña de acceso a una GUI. Para ello en las condiciones iniciales de la GUI (OpeningFcn) ponemos el siguiente código:

clave='123';
entrada=inputdlg('Introduzca una contraseña: ','Verificando acceso...',1,{'?'});
entrada=cell2mat(entrada);
if ~strcmp(entrada,clave)
    msgbox('Contraseña incorrecta');
    close(gcf);
end

El código anterior simplemente abre un "input dialog" (cuadro de diálogo) que permite introducir una cierta cadena de texto. La cadena introducida se guarda en la variable "entrada" y se compara con la cadena guardada en "clave". En el caso de coincidir la ejecución continúa de manera ordinaria abriendo la GUI, y en el caso de no coincidir simplemente cierra la GUI y muestra un mensaje de texto (msgbox).

Sugerencia: Para evitar errores borre la línea que se crea por default en OutputFcn. Claro que lo anterior es adecuado en el caso de que usted no requiera devolver argumentos de salida.