martes, 28 de noviembre de 2017

Receta MATLAB No. 1-0: Generalidades de MATLAB

Índice

1. Introducción
2. Palabras Clave
3. Generalidades
4. Historia
5. Matrices Todo el Tiempo
6. Cadenas de Caracteres
7. Estructuras de Datos
8. Arreglos
9. Arreglos Lógicos
10. Ámbitos de Variables
11. Operadores y Palabras Clave
12. Conclusiones
13. Literatura & Enlaces

1. Introducción

En lugar de una receta, esta primer documento pretende esbozar las generalidades de los temas que se practicarán a lo largo de la serie de recetas Codificación. Aquí el lector ganará una vista general y podrá notar la forma de trabajo de esta técnica basada en recetas.


Se aprovecha este documento para exponer las generalidades del lenguaje de programación incorporado en MATLAB para manipular símbolos.

2. Palabras Clave

  • Arreglo
  • Codificación
  • Java
  • MATLAB
  • Operador
  • Receta

3. Generalidades

El lector se familiarizará con los siguientes aspectos esenciales de MATLAB:
  • Sintaxis
  • Programación
  • Características principales
  • Espacio de trabajo
De vital importancia será conocer la evolución que ha evidenciado MATLAB en los últimos años. Ya no se considera un paquete para hacer manipulación tipos de datos basados en matrices. Ahora se pueden mencionar características como:
  • Tipos de datos enteros, punto flotante
  • Estructuras de datos
  • Programación orientada a objetos
  • Integración con el lenguaje de programación Java, Python y C++
  • Clases

En la versión más reciente, R2017b (Introducción a Recetas MATLAB), se evidencia una entorno de trabajo basado en cintas (ribbon), y claramente sofisticado:
Ventana principal de MATLAB
Figura 1. Ventana principal de MATLAB.
Este entorno posee completas capacidades para soportar el trabajo de un desarrollador o programador:
  • Editor inteligente para código fuente
  • Analizador de código
  • Depurador
  • Log de actividades
  • Historial de comandos introducidos

4. Historia

MATLAB fue creado por un profesor alrededor del año 1970. El primer objetivo era ofrecer capacidades de manipulación sobre matrices. Su nombre procede MATrix LABoratory. Su evolución le ha llevado incluir un conjunto de librerías bajo el nombre LAPACK (Linear Algebra Package).

5. Matrices todo el Tiempo

El tipo de dato por defecto es la matriz de doble precisón. Por lo tanto, el programador no requiere especificar el tipo de dato a la hora de declarar el nombre de una variable.

Este ejemplo crea una matriz cuadrada de 3 x 3:

a = [7 3 4; 9 5 1; 7 8 6];

Cada fila de la matriz está separada por un punto y coma (;).

Para acceder a un elemento específico de la matriz basta con escribir:

a(2, 2);

Con este comando se obtiene el valor 5.

Las operaciones matriciales comunes como potencia de una matriz, matriz transpuesta, o suma o producto de matrices se puede computar asi:

b = a' * a;
c = a ^ 2;
d = b + c;

6. Cadenas de Caracteres

Definir una cadena de caracteres es supremamente sencillo:

nombre = 'Fyodor';
apellido = 'Dostoevsky';
nombreCompleto = [nombre apellido];

Nótese que la concatenación de cadenas de caracteres es muy fácil: en el último comando se especifica entre paréntisis angulares, y separados por espacio, las variables o literales que se quieren concatenar.

En la Tabla 1 (Paluszek et Thomas, 2015) se definen algunas funciones interesantes para tratar valores de este tipo de dato:
Funciones de cadenas de caracteres
Tabla 1. Funciones de cadenas de caracteres (Paluszek et Thomas, 2015).

7. Estructuras de Datos

Para definir una estructura de datos se recomienda usar una función donde se definan los campos y, eventualmente, valores de inicialización o por defecto:

e = Estructura;
e(2) = Estructura;

function e = Estructura
e =   struct ; 
e.campo1 = 32.0;  
e.campo2 = 'Dostoevsky'; 
end

En este fragmento de código se define una estructura que contiene dos campos. Esta forma de encapsular o relacionar datos es lo que permite referirse a una entidad de forma únivoca y ordenada.

8. Arreglos

Los arreglos en MATLAB son la estructura de datos por excelencia para contener cualquier tipo de dato. Se pueden formar vectores, matrices bidimensionales o multidimensionales.

La forma de declarar un arreglo se logra a través de

numeroPrimos = [2 3 5 7 11];

numerosPares = [2 4 6; 8 10 12; 14 16 18];

La primera expresión crea un arreglo unidimensional, mientras que la segunda una matriz de 3x3.

Para acceder a un elemento basta con usar

numerosPrimos(4)

9. Arreglos lógicos

Una arreglo lógico en MATLAB está únicamente compuesto por ceros y unos. Para inicializarlos se puede especificar un valor lógico: verdadero => 1, false => 0. Y existen funciones para determinar si un arreglo es lógico:

isLogical(arregloLogico);

10. Ámbitos de Variables

Las variables declaradas dentro de una función tienen ámbito o contexto local; mientras que aquellas declaradas por fuera de cualquier función, o en un script tienen ámbito global.

11. Operadores y Palabras Clave

MATLAB cuenta con una variedad de operadores y palabras claves para la manipulación de datos y estructuras de datos. Entre ellas tenemos:

11.1 Coma

La coma (,) se utiliza para la creación de una lista de índices. Ejemplo de uso:

arreglo(1, 1:2);

arreglo(:, 1)

La primera expresión retorna una lista, mientras que la segunda obtiene todos los elementos de una dimensión. Nótese que arreglo(1, 1:2) la coma está entre dos enteros: esta es la forma de crear una lista en MATLAB.

11.2 La crema

El operador ~ (o crema) es usado para negar valores lógicos. Supóngase que se tiene la siguiente matriz:

matriz = [0 1; 0 1]

Al aplicar la negación sobre esta matriz

~matriz

se obtiene

[1 0; 1 0]

11.3 Punto

El operador punto tiene un significado particular en MATLAB: .*, .\^..

Por ejemplo, para multiplicar los elementos de dos dos matrices es común recurrir a un ciclo for, pero a través del operador .* se puede lograr la multiplicación de uno a uno los elementos integrales de la matriz:

y = a .* b;

Esta expresión es más óptima que esta otra:

for k = 1:10
    y(k) = a(k) * b(k);
end

Existen otros operadores relevantes, aquí sólo se mencionan unos pocos, pero a medida que avancemos reconoceremos otra variedad interesante. Seguro que la exploración a través de recetas nos facilitará explotar los recursos computacionales que provee este magnífico lenguaje computacional e ir más allá.

12. Conclusiones

Esta receta introductoria nos abre camino a explorar el magnífico mundo de MATLAB: un lenguaje computacional usado en la academia y en la industria.

La siguientes entregas consistirán en el uso de elementos comunes y esenciales para el dominio de este lenguaje. ¡Así que preparados!

13. Literatura & Enlaces

Paluszek, M., Thomas, S. (2015). MATLAB Recipes: A Problem-Solution Approach. United States: Apress.
Introducción a Recetas MATLAB (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/11/introduccion-a-recetas-matlab.html


O

lunes, 27 de noviembre de 2017

Introducción a Recetas MATLAB

Índice

1. Introducción
2. Palabras Clave
3. Descarga
4. Instalacion
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

A partir de este momento los lectores de este blog podrán encontrar, ademá de temas relacionados con tecnologías de desarrollo de Microsoft, interesantes recetas acerca de MATLAB: un lenguaje computacional para la operación de estructuras en forma de matrices (cálculo matricial o álgebra lineal). Las recetas se concentran en el uso de los elementos del lenguaje, y la construcción de interfaces gráficas de usuario.



El uso de este software es común en la academia como en la investigación. El lector tendrá la oportunidad de acceder a contenido de aplicación directa en sus requerimientos computacionales sobre esta poderosa herramienta. Es posible que el lector encuentre elementos de MATLAB que jamás haya usado y que resulten prácticos y útiles para sus desarrollos o scripts.
Logo MATLAB
Figura 1. Logo MATLAB.

2. Palabras Clave

  • Álgebra Lineal
  • Cálculo matricial
  • Lenguaje copmptuacional
  • MATLAB
  • Receta
  • Software

3. Descarga

MATLAB puede ser descargado para un período de prueba de 30 días desde el siguiente enlace:

Desde aquí se puede descargar una versión de prueba para poner en práctica cualquier receta aquí descrita. En el momento de la redacción de este artículo se cuenta con la versión R2017b:
Descarga de MathWorks MATLAB
Figura 2. Descarga de MathWorks MATLAB.

4. Instalación

Para el proceso de instalación basta con seguir el asistente visual de instalación; solo basta que especifiquemos los componentes que deseamos instalar, la ruta de instalación (una unidad que contenga bastante espacio libre), e iniciar la instalación de los archivos de programa. Este proceso puede tomar hasta 60 minutos (depende esencialmente de los recursos hardware del sistema).

El proceso de activación puede realizarse a través de los datos del período de prueba (caso más común y que posiblemente sigan la mayoría de los lectores), o por medio de la llave entregada a la hora de la compra del producto.

5. Conclusiones

Se describió brevemente el propósito del proyecto de Recetas MATLAB. Futuras recetas introducirán los elementos de programación que provee este lenguaje computacional y lector se beneficiará de estos contenidos para su aprendizaje, trabajo o cualquier otra práctica.

¡Los espero!

6. Literatura & Enlaces

MATLAB - Wikipedia (2017). Recuperado desde: https://en.wikipedia.org/wiki/MATLAB
Download MATLAB, Simulink, Stateflow, and Other MathWorks Products (2017). Recuperdo desde: https://www.mathworks.com/downloads/


O

domingo, 26 de noviembre de 2017

Diccionarios en C# - Parte 2/6: IDictionary

Índice

1. Introducción
2. Palabras Clave
3. La Interfaz IDictionary
3.1 Generalidades
3.2 Propiedades y métodos sobresalientes
3.3 Diferencias frente a la versión genérica
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

Estudiáremos en este artículo la interfaz no-genérica para representar una estructura de datos como diccionario: IDictionary. Aprenderemos que el tipo de dato para los elementos del diccionario es DictionaryEntry. Se resaltarán las diferencias respecto a su contraparte genérica IDictionary<TKey, TValue>.

2. Palabras Clave

  • Colección
  • Diccionario
  • Estructura de datos
  • No-genérico

3. La Interfaz IDictionary

3.1 Generalidades

Esta interfaz está diseñada para representar una colección que almacene o guarde sus elementos como un diccionario: cada elemento se distingue con una llave (o ID) y una valor asociado a esa llave; la recuperación se lleva a cabo por esa misma llave.

Implementa las interfaces ICollection y IEnumerable para que adquirir el comportamiento y estado de una colección y permitir la enumeración de los elementos.

En relación con lo anterior, los elementos de la colección son de tipo DictionaryEntry. Esta es una estructura que define una llave y un valor. Como consecuencia al recuperar un elemento de la colección IDictionary lo que se obtiene es un objeto de esta estructura, en lugar de un elemento del tipo de dato de la llave o el valor ("DictionaryEntry Structure", 207).

3.2 Propiedades y métodos sobresalientes

Entre las propiedades sobresalientes de esta interfaz se hallan:
  • Count: Obtiene la cantidad de elementos en la colección.
  • Keys: Obtiene todas las llaves.
  • Values: Obtiene todos los valores.
En cuanto a los métodos se pueden mencionar:
  • Add: Agrega un elemento con una llave de tipo Object y un valor del mismo tipo de dato.
  • Contains(Object): Comprueba si el diccionario contiene un objeto a partir de su llave.

3.3 Diferencias frente la versión genérica

Además de la carencia de genericidad, IDictionary se diferencia funcionalmente de su contraparte genérica IDictionary<TKey, TValue> (Diccionarios en C# - Parte 1/6: IDictionary(TKey, TValue)) en los siguientes aspectos (Albahari, 2012):
  • Al intentar recuperar un elemento inexistente por su llave se retorna null en lugar de generarse una excepción.
  • El método Contains comprueba la existencia por llave, mientras que ContainsKey de IDictionary<TKey, TValue> realiza lo mismo.

4. Conclusiones

Conocimos de forma breve la versión no-genérica de IDictionary. La interfaz para colecciones que no requieren la distinción de los tipos de datos para llave y valor. Se expusieron las diferencias fundamentales frente la versión genérica IDictionary<TKey, TValue>.

En el siguiente artículo hablaremos más acerca de IDictionary<TKey, TValue> y aprenderemos acerca de Hashtable.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
IDictionary Interface (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.idictionary%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
DictionaryEntry Structure (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.dictionaryentry(v=vs.110).aspx
Diccionarios en C# - Parte 1/6: IDictionary(TKey, TValue) (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/11/diccionarios-en-csharp-parte-1-6-idictionary-tkey-tvalue-.html


O

domingo, 19 de noviembre de 2017

Diccionarios en C# - Parte 1/6: IDictionary(TKey, TValue)

Índice

1. Introducción
2. Palabras Clave
3. La Interfaz IDictionary<TKey, TValue>
4. Ejemplo de Uso
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

Entramos al estudio de los diccionarios: una estructura de datos o colección donde los elementos se representan con dos partes: una llave y un valor. Facilita la búsqueda, y es apropiada para listas ordenadas. En esta serie comprenderemos las interfaces que provee .NET para los diccionarios: IDictionary y IDictionary(TKey, TValue). También se incluye la descripción de implementaciones: OrderedDictionary, HybridDictionary y ListDictionary.


Este primer artículo describe la interfaz IDictionary(TKey, TValue), la cual constituye la interfaz para colecciones genéricas basadas en una llave y un valor.

2. Palabras Clave

  • Diccionario
  • Estructura de Datos
  • Llave
  • Valor

3. Diccionario


En el mundo de las colecciones o estructuras de datos un diccionario dispone los elementos por una llave y un valor asociado a esa llave. Para acceder a un elemento basta con especificar su llave; luego, la llave se puede ver como la palabra en un diccionario enciclopédico y su valor como su definición.
Analogía con diccionario enciclopédico
Figura 1. Analogía con diccionario enciclopédico ("Imagen diccionario", 2017).

Entre las características distintivas de esta estructura se hallan (Albahari, 2012)
  • Los datos o contenido de un elemento se acceden a través de un valor único.
  • El acceso tiene un complejidad O(1).
  • Una de la llave es través de un algoritmo de hash.
  • La estructura se análoga a un mapa: dado un nombre se accede a la locación concreta donde se haya el elemento.
  • Es posible tener como llave un valor null.
  • Se puede especificar un enumerador pero sin la promesa que el contenido esté ordenado.
En C# existen diferentes implementaciones de diccionario: la primera que se va a estudiar es IDictionary<TKey, TValue>.

3. La Interfaz IDictionary<TKey, TValue>

Esta interfaz representa un diccionario con llave y valor genéricos: TKey, TValue. En la firma de encabezado de esta interfaz se aprecia que implementa la interfaz genérica ICollection<KeyValuePair<TKey, TValue>>; y así mismo la adaptación a estructura enumerable con IEnumerable<KeyValuePair<TKey, TValue>>.

Entre sus propiedades genéricas se hallan ("IDictionary", 2017)
  • Count: Obtiene el número de elementos en el diccionario; i.e., la cantidad de llaves.
  • Keys: Llaves del diccionario.
  • Values: Valores del diccionario.
Y así mismo, estos métodos ("IDictionary", 2017):
  • Add(T): Agrega un elemento al diccionario.
  • Add(TKey, TValue): Agrega un elemento a partir de una llave y un valor.
  • Contains(T): Comprueba si un elemento existe en la colección.
  • Remove(T): Remueve la primera ocurrencia.
  • Remove(TKey): Remueve un elemento a través de su llave.
Para el método Add vale apuntar que si se intenta agregar un elemento con la misma llave, la excepción ArgumentException (Excepciones en C# - Parte 5: Ejemplos de Excepciones Comunes) es lanzada.

Para la enumeración de los elementos se provee el método GetEnumerator. Este método retorna una secuencia de objetos KeyValuePair: representa la llave y el valor de cada uno de los elementos que contiene el diccionario.

4. Ejemplo de Uso

Veamos el siguiente ejemplo de uso básico:

En la línea 10 se crea una instancia de la implementación concreta de IDictionary<TKey, TValue>. Esta instancia representa la asociación de extensiones de tipos de archivos con el programa manejador para apertura: en las líneas 13-16 se agregan los elementos, y luego, en las líneas 18-22 se itera el diccionario: notemos aquí que cada elemento se presenta con un objeto KeyValuePair<string, string>.

5. Conclusiones

Describimos la interfaz IDictionary<TKey, TValue>: representación general o abstracta de una estructura de datos basada en diccionario: cada elemento se presenta por dos ítems: una llave y un valor. Su analogía principal es la de Dictionary<TKey, TValue>.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.

Imagen diccionario (2017). Recuperado desde: https://androidayuda.com/app/uploads/2015/02/diccionario-2.jpg
IDictionary(TKey, TValue) Interface (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/s4ys34ea(v=vs.110).aspx
Excepciones en C# - Parte 5: Ejemplos de Excepciones Comunes (2017). Recuperado desde: https://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-5-ejemplos-de-excepciones-comunes.html


O

lunes, 6 de noviembre de 2017

Listas, Colas, Pilas y Conjuntos en C# - Parte 6/6: HashSet(T) y SortedSet(T)

Índice

1. Introducción
2. Palabras Clave
3. Clase Genérica HashSet<T>
4. Clase Genérica SortedSet<T>
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

Cada nueva versión mayor de .NET Framework trae consigo cambios sobresalientes: entre ellos se puede contar la adición de dos elementos de programa: HastSet<T> y SortedSet<T>. Estas dos clases genéricas son colecciones que resaltan por métodos de búsqueda basado en hash, no permiten la agregación de elementos duplicados, y no cuenta con acceso basado en índice o posición. Este último artículo de la serie Listas, Colas, Pilas y Conjuntos en C# describe, grosso modo, estas dos interesantes clases, exponiendos sus características importantes.

2. Palabras Clave

  • .NET Framework
  • Clase
  • Colección
  • Genéricos
  • Hash

3. Clase Genérica HashSet<T>

La clase genérica HashSet<T> almacena los elementos sin un orden particular, y su implementación consiste en llaves almacenadas en una estructura hashtable (o tabla de hash); estas llaves representan el identificador unívoco para acceder a los de la tabla.

Cuenta con la implementación de la interfaz genérica ICollection<T>: en consecuencia, posee con métodos de acceso y mutación como Contains, Add y Remove.

¿Pero qué hace interesante esta clase? De acuerdo con "HashSet(T) Class" (2017), esta clase cuenta con operaciones de conjuntos de alto rendimiento. Por ejemplo, se pueden mencionar los métodos:
  • UnionWith(IEnumerable<T>): lleva a cabo la operación de conjuntos unión de elementos de dos colecciones.
  • InsersectWith(IEnumerable<T>): realiza la operación de conjuntos intersección para generar el conjunto de elementos comunes a dos colecciones.
  • ExceptWith(IEnumerable<T>): ejecuta la operación de substracción.
Estos métodos y otros son de naturaleza destructiva (Albahari, 2012); esto quiere decir que, por ejemplo, la operación de IntersectWith modifica la estructura removiendo los elementos que no son comunes entre ambos conjuntos.

Veamos este ejemplo de uso:

El resultado de ejecución de este programa es:


Contenido conjunto números pares:
2 4 6 8 10 
Contenido conjunto números impares:
1 3 5 7 9 
Conjunto resultante de la unión de pares e impares:
2 4 6 8 10 1 3 5 7 9 
En ideone.com se puede probar online la ejecución del código: https://ideone.com/nvubPq

4. Clase Genérica SortedSet<T>

Esta es otra clase alto desempeño orientada a almacenar información como un conjunto: donde los elementos no se repiten. A diferencia de HashSet<T>, SortedSet<T> almacena los elementos de forma ordenada.

Internamente esta clase está implementada usando un árbol rojo-negro ("Árbol rojo-negro", 2017)Al igual que HashSet<T>, SortedSet>T> implementa la interfaz genérica IEnumerable<T> para la enumeración de elementos de la colección (Enumeración e Interfaces IEnumerator(T) e IEnumerable(T) en C# (2017)).

Supongamos que creamos el siguiente código de ejemplo:

SortedSet<char> dostoevsky = new SortedSet<char>("dostoevsky");

Al iterar este objeto 

foreach(char c in dostoevsky)
{
    Console.Write(c);
}

se obtienen los siguientes caracteres ordenados alfabéticamente:

dekostvy

El constructor de esta clase acepta como argumento un objeto IComparar<T> que sirva como especificador de método de comparación (Albahari, 2012).

5. Conclusiones

Se exploraron dos clases nuevas para el almacenamiento y manipulación de elementos de teoría de conjuntos. El uso apropiado de estas clases para proyectos de software que requieran tratar datos con operaciones de teoría de conjuntos puede eventualmente dar como resultado software eficiente gracias al alto rendimiento de estas estructuras.

La siguiente serie de artículos  tratará acerca de estructuras de datos basadas en diccionarios.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
HashSet(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb359438%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
SortedSet(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/dd412070%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Árbol rojo-negro - Wikipedia, la enciclopedia libre (2017). Recuperado desde: https://es.wikipedia.org/wiki/%C3%81rbol_rojo-negro
Enumeración e Interfaces IEnumerator(T) e IEnumerable(T) en C# (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/08/enumeracion-e-interfaces-ienumerator-t-e-ienumerable-t-en-csharp.html


O