Guía de estilo para MATLAB: Estructuras

Publicado el 02 febrero 2013 por Evaristor

Cuando proceso datos en MATLAB uso estructuras. El uso de estructuras hace engorroso el acceso a los datos pero me facilita el manejo de los metadatos. Para cada variable creo una estructura con el campo datos donde almaceno el valor de la variable; el resto de los campos de la estructura contienen los metadatos.

Ejemplo 1

Para ilustrar el caso más sencillo, cuando tenemos un único conjunto de datos, supongamos que queremos graficar una serie de tiempo de la marea.

% Inicializar
clear, close all

% Se define la variable independiente
Xdatos = linspace(0,24);
Xnombre = 'Tiempo';
Xunidades = 'Horas';
XhusoHorario = 'UTC-8';

% Se define la variable dependiente
Ydatos = sin(Xdatos/24*2*pi);
Ynombre = 'Altura del Nivel del Mar';
Yunidades = 'm';
YnivelReferencia = 'Baja Mar Media Inferior';

% Graficado
plot(Xdatos,Ydatos)
xlabel([Xnombre ' (' Xunidades ')']);
ylabel([Ynombre ' (' Yunidades ')']);

Ejemplo 2

Ahora consideremos un caso más complicado; supongamos que tenemos varias series de tiempo. En este caso uso una estructura anidada donde cada campo es una variable y agrego un campo extra llamado Info que a su vez es una estructura que contiene los metadatos de cada conjunto de datos (no de las variables).

% Inicializar
clear, close all

% Se define la primer serie de tiempo
S(1)Infonombre='Ensenada, B.C.';
S(1)Infocoordenadas='31.8667 -116.5964';
S(1)Infoclave='9mtj6c1j5xkht';
S(1)Xdatos = linspace(0,24);
S(1)Xnombre = 'Tiempo';
S(1)Xunidades = 'Horas';
S(1)Ydatos = sin(S(1)Xdatos/24*2*pi);
S(1)Ynombre = 'Altura del Nivel del Mar';
S(1)Yunidades = 'm';

% Se define la segunda serie de tiempo
S(2)Infonombre='El Sauzal, B.C.';
S(2)Infocoordenadas='31.9007 -116.6880';
S(2)Infoclave='9mtj2xq7h7jvk';
S(2)Xdatos = linspace(0,24);
S(2)Xnombre = 'Tiempo';
S(2)Xunidades = 'Horas';
S(2)Ydatos = cos(S(2)Xdatos/24*2*pi);
S(2)Ynombre = 'Altura del Nivel del Mar';
S(2)Yunidades = 'm';

% Graficado
figure, hold on
arrayfun(@(S) (plot(SXdatos , SYdatos, ...
  'color',rand(1,3))), S) xlabel([S(1)Xnombre ' (' S(1)Xunidades ')']); ylabel([S(1)Ynombre ' (' S(1)Yunidades ')']); legend(arrayfun(@(S) (SInfonombre), S, ...
  'UniformOutput',false))

Es importante que Info sea el único campo que no contiene el campo datos.