sábado, 23 de noviembre de 2013

Ordenar Palabras Alfabéticamente


El siguiente "script" permite ordenar palabras introducidas por el usuario de manera alfabética.

clear all;clc;
N=input('Número de Palabras: ');
for i=1:N
    M{i}=input(sprintf('Palabra %s: ',num2str(i)),'s');
end
MS=sort(M);
fprintf('\n*** Palabras ordenadas alfabéticamente ***\n');
for i=1:N
    fprintf('%s. %s\n',num2str(i),MS{i});
end

viernes, 1 de noviembre de 2013

Colocar imagen/ícono de fondo en un Push Button


En esta entrada veremos cómo colocar una imagen o ícono en un Push Button utilizando GUIDE.

Para este que es un ejemplo simple, la imagen deberá ser del mismo tamaño que el Push Button. En mi caso utilizaré una imagen de 35x35 px llamada "ayuda" en formato "png" y que se encuentra en el mismo directorio que nuestra GUI. 

Primeramente accedemos a las propiedades del Push Button dando clic derecho sobre él y seleccionando la opción "Property Inspector", enseguida modificamos primeramente la propiedad "Units" cuyo valor por defecto es "characters", en lugar de ello seleccionamos "pixels". Luego modificaremos de la propiedad "Position" sus valores "width" y "height" de acuerdo al tamaño (ancho y alto) de nuestra imagen en pixeles, y además borramos el "String", los pasos anteriores se muestran en la siguiente figura con las modificaciones ya hechas:



Una vez hecho lo anterior, en el mismo "Property Inspector" buscamos la propiedad "CData" y en ella colocamos la instrucción que se muestra en la imagen siguiente:


Al dar clic fuera de la propiedad modificada, os deberá mostrar algo similar a lo que se muestra en la siguiente imagen (matriz que contiene toda la información acerca de nuestra imagen):


Si habéis hecho los pasos anteriores de forma adecuada, os debería quedar algo similar a lo que se muestra enseguida, con el Push Button conteniendo una imagen de fondo:


sábado, 12 de octubre de 2013

Gráficas de funciones paramétricas en 2D


Para graficar una función dadas sus ecuaciones paramétricas simplemente necesitamos crear un vector que definirá al parámetro “t”, para ello podemos usar el comando “linspace” y crear un vector equiespaciado en un rango definido, y posteriormente graficar ambas ecuaciones paramétricas con la instrucción “plot”, el siguiente ejemplo muestra cómo graficar una circunferencia dadas sus ecuaciones paramétricas:


clear all;clc;
t=linspace(0,2*pi,100); % Definimos el vector del parámetro
x=cos(t); % Ecuación paramétrica
y=sin(t); % Ecuación paramétrica
plot(x,y),axis equal; % Instrucción de graficar y mostrar los ejes en proporción 1:1



Gráficas en coordenadas polares


Para trazar la gráfica de una función en coordenadas polares utilizaremos el comando “polar”, el cual necesita cómo argumentos el vector “theta”  y el vector “r” que define la función en coordenadas polares. A continuación se muestra el ejemplo de una espiral:


clear all;clc;
theta=linspace(0,10*pi,1000); % Vector theta
r=theta; % Función en coordenadas polares (espiral)
polar(theta,r,'r'); % Instrucción de graficar



Número de argumentos de entrada y salida de una función (nargin & nargout)


Una función definida en MATLAB tiene la siguiente estructura general:
function [x1, x2,.., xn]= nombrefuncion(a1,a2,…,an)
donde x1, x2,…,xn, son las variables de salida de la función y a1,a2,…,an, son los argumentos de entrada de la función.
En MATLAB las funciones pueden soportar un procedimiento específico acorde al número de argumentos que reciba o bien devolver uno o más valores según sean requeridos por el usuario.
Para ello se hace uso de las palabras reservadas nargin (número de argumentos de entrada) y nargout (número de variables de salida). Las cuales pueden ser utilizadas en una función para realizar un proceso determinado para un número de entradas o salidas definidas.
A continuación se muestra una función muy simple a modo de ejemplo:

function[suma,resta]=mifuncion(n1,n2)
if nargin~=2
    error('Número de argumentos de entrada no válidos');
end
if nargout==1
    suma=n1+n2;
end
if nargout==2
    suma=n1+n2;
    resta=n1-n2;
end
end


En el ejemplo anterior, utilizamos nargout para verificar cuantas variables de salida se están “solicitando” y con ello proporcionar una salida adecuada. De igual manera se utiliza nargin para garantizar que el número de argumentos de entrada sean los correctos, es decir, no diferente de dos para este caso.

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