viernes, 4 de noviembre de 2011

PRUEBA DE CODIGO HUFFMAN C

Saludos Compañeros, si me ayudan con lo siguiente, debido a que se a optado por elegir el lenguaje C como el lenguaje a ser usado con matlab, seria bueno probar el siguiente código, creo que así como el "suma.c" que se ha mencionado  y  probado seria útil, para seguir continuando con el desarrollo del codigo

"RECALCO QUE SOLO ES PARA PROBAR LA CONEXION QUE HAN INDICADO C MATLAB y generar el archivo MEX" 
Adjunto el link del paquete con todos los archivos del proyecto C para Huffman 


1.- Descargar ps4.zip y descomprimirlo en su directorio personal. 

2.- El archivo ps4.zip archivo contiene una solución de Visual Studio y el código fuente c para la aplicación de codificación de Huffman.

3.- Hacer clic en el archivo de Visual Studio PS4.sln debe abrir, y se podrá ver una vista que muestra el archivo de origen huffman.c

La parte derecha de la ventana muestra todos los archivos de origen del proyecto que son tres:

huffman.c - en donde se define main (int, char **) (la función llamada al inicio de la ejecución), y readInputFile (FILE *) para la lectura de todos los caracteres en un file string.

htree.c - define los procedimientos para la implentacion de la codificación y decodificación Huffman
htree.h - archivo de cabecera que define el tipo de datos htree que utilizamos para poner en práctica un árbol de Huffman


4.- Se debe entonces obtener el ejecutable que seria huffman.exe


5.- Luego Intentarlo ejecutar desde el shell de Windows:

 C: \ cs216 \ ps4 \ Debug> Huffman
 Uso: Huffman [-d] [-b] <entrada> [<salida>]

La opción-d se utiliza para la decodificación. La opción-b se utiliza para seleccionar bits de codificación (en lugar de imprimir 0 y 1 como caracteres en el archivo de salida)


AGREGO EL LINK DE DONDE SE A OBTENIDO TAL INFORMACION Y PARA QUE VERIFIQUEN CUALQUIER DUDA CON RESPECTO AL FUNCIONAMIENTO

jueves, 27 de octubre de 2011

Partes esenciales de un archivo MEX

Todos los archivos MEX que se requieren para enlazar código escrito en C y código de MATLAB contienen componentes necesarios para su correcto funcionamiento.

Dentro de éstos se incluyen; una librería "mex.h" que contiene las funciones de la API del sistema operativo, una función llamada "mexFunction" que permite realizar funciones de gateway, un arreglo llamado "mxArray" y funciones propias de la API.

La librería mex.h se incluye en las declaraciones del código tal como se muestra a continuación:

#include <stdio.h>
#include <stdlib.h>
#include "mex.h"

Luego se declara la función principal del código por medio de mexFunction, y se utilizan cuatro parámetros básicos, tal como se muestra a continuación:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
código
}

Los parámetros se describen en la siguiente tabla:

mexFunction Name of the gateway routine (same for every MEX-file)
nlhs Number of expected mxArrays (Left Hand Side)
plhs Array of pointers to expected outputs
nrhs Number of inputs (Right Hand Side)
prhs Array of pointers to input data. The input data is read-only and should not be altered by your mexFunction .

Por otra parte mxArray permite trabajar con distintos tipos de datos en forma estructurada, y es la forma en cómo los datos del código en C se comunican con los datos del código propio de MATLAB.

Finalmente, las funciones usadas, propias de la API que estan en la librería mex.h, se caracterizan por tener como prefijo la palabra mex, sin embargo tienen la misma funcionalidad que el lenguaje C. Por ejemplo la función printf() del lenguaje C equivale a la función mexprintf() de las funciones de esta interfaz.



Ejemplo de Programa en C portado a Matlab

1. Necesitamos el programa desarrolado en c, con la siguiente libreria y cabecera:

#include "mex.h"
/* mexFunction es la rutina de enlace con el código C. */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/*Codigo*/
}

2. Guardar el archivo .c en la carpeta de trabajo de matlab
3. Para compilar el codigo utilizar el siguiente comando:


>> mex -v -g archivo.c

4. Matlab nos genera un archivo .mexw32, quese guarda automaticamente en la carpeta de trabajo de matlab, este archivo lo llamamos como una funcion desde la ventana de comandos o desde un script de matlab

>> archivo

Desarrolo del ejemplo:


Código en C:


#include <stdio.h>
#include <stdlib.h>
#include "mex.h"

/* mexFunction es la rutina de enlace con el código C. */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
 double a, b, suma,resta, multiplicacion,division;
a=2;
b=3;
mexPrintf ("valor de a:%g \n",a);
mexPrintf ("valor de b:%g \n\n",b);
suma=a+b;
resta=a-b;
multiplicacion=a*b;
division=a/b;

mexPrintf ("Valor de suma:%g\n",suma);
mexPrintf ("Valor de resta:%g\n",resta);
mexPrintf ("Valor de multiplicacion:%g\n",multiplicacion);
mexPrintf ("Valor de division:%g\n",division);

/*return EXIT_SUCCESS;*/
}


Guardamos el archivos en la carpeta MATLAB


Compilación desde la ventana de comandos de matlab



Se crea el archivo  suma.mexw32



Ejecutamos como una función






miércoles, 26 de octubre de 2011

Configurar el compilador a utilizar

1. Mediante el comandmex -setup elegir el tipo de compilador a utilizar

>> mex -setup
Please choose your compiler for building external interface (MEX) files: 


2. Aceptamos que el computador busque los compiladores instalados con y

 Would you like mex to locate installed compilers [y]/n? y

 3. Seleccionamos un compilador de la lista y aceptamos

Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2009a\sys\lcc
[2] Microsoft Visual C++ 2008 SP1 in C:\Program Files\Microsoft Visual Studio 9.0

[0] None

Compiler: 1

Please verify your choices:

Compiler: Lcc-win32 C 2.4.1
Location: C:\PROGRA~1\MATLAB\R2009a\sys\lcc

Are these correct [y]/n? y

Trying to update options file: C:\Users\PAMR\AppData\Roaming\MathWorks\MATLAB\R2009a\mexopts.bat
From template:              C:\PROGRA~1\MATLAB\R2009a\bin\win32\mexopts\lccopts.bat

Done . . .

**************************************************************************
  Warning: The MATLAB C and Fortran API has changed to support MATLAB
           variables with more than 2^32-1 elements.  In the near future
           you will be required to update your code to utilize the new
           API. You can find more information about this at:
           http://www.mathworks.com/support/solutions/data/1-5C27B9.html?solution=1-5C27B9
           Building with the -largeArrayDims option enables the new API.
**************************************************************************