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 de la variable.
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
X.datos = linspace(0,24);
X.nombre = 'Tiempo';
X.unidades = 'Horas';
X.husoHorario = 'UTC-8';
% Se define la variable dependiente
Y.datos = sin(X.datos/24*2*pi);
Y.nombre = 'Altura del Nivel del Mar';
Y.unidades = 'm';
Y.nivelReferencia = 'Baja Mar Media Inferior';
% Graficado
plot(X.datos,Y.datos)
xlabel([X.nombre ' (' X.unidades ')']);
ylabel([Y.nombre ' (' Y.unidades ')']);
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 solo un campo extra llamado Info que a su vez es una estructura que contiene todos los metadatos de cada conjunto de datos (no de las variables).
% Inicializar
clear, close all
% Se define la primer serie de tiempo
S(1).Info.nombre='Ensenada, B.C.';
S(1).Info.coordenadas='31.8667 -116.5964';
S(1).Info.clave='9mtj6c1j5xkht';
S(1).X.datos = linspace(0,24);
S(1).X.nombre = 'Tiempo';
S(1).X.unidades = 'Horas';
S(1).Y.datos = sin(S(1).X.datos/24*2*pi);
S(1).Y.nombre = 'Altura del Nivel del Mar';
S(1).Y.unidades = 'm';
% Se define la segunda serie de tiempo
S(2).Info.nombre='El Sauzal, B.C.';
S(2).Info.coordenadas='31.9007 -116.6880';
S(2).Info.clave='9mtj2xq7h7jvk';
S(2).X.datos = linspace(0,24);
S(2).X.nombre = 'Tiempo';
S(2).X.unidades = 'Horas';
S(2).Y.datos = cos(S(2).X.datos/24*2*pi);
S(2).Y.nombre = 'Altura del Nivel del Mar';
S(2).Y.unidades = 'm';
% Graficado
figure, hold on
arrayfun(@(S) (plot(S.X.datos , S.Y.datos, ...
'color',rand(1,3))), S)
xlabel([S(1).X.nombre ' (' S(1).X.unidades ')']);
ylabel([S(1).Y.nombre ' (' S(1).Y.unidades ')']);
legend(arrayfun(@(S) (S.Info.nombre), S, ...
'UniformOutput',false))

Es importante distinguir los metadatos asociados a las series de tiempo, los cuales son campos en Info, de los metadatos correspondientes a las variables, los cuales son campos en la estructura de cada variable. Así, Info es el único campo que no contiene el campo datos. También conviene observar que length(S) es igual al número total de conjuntos de datos y que
all(arrayfun(@(S) (length(S.Y)==1),S)) es verdadero.