• No results found

Fundamental Analysis & Recommendations

6.1 Course Restructure Discussion

6.1.1 Fundamental Analysis & Recommendations

3. Las funciones matriciales propias del Álgebra Lineal (det(), inv(), etc.) no se pueden

aplicar a hipermatrices. Para poderlas aplicar hay que extraer primero las matrices correspondientes (por ejemplo, con el operador dos puntos (:)).

4.3 Estructuras

Una estructura (struct) es una agrupación de datos de tipo diferente bajo un mismo nombre. Estos datos se llaman miembros (members) o campos (fields). Una estructura es un nuevo tipo de dato, del que luego se pueden crear muchas variables (objetos o instances). Por ejemplo, la estructura

4.3.1 CREACIÓN DE ESTRUCTURAS

En MATLAB la estructura alumno se crea creando un objeto de dicha estructura. A diferencia de otros lenguajes de programación, no hace falta definir previamente el modelo o patrón de la estructura. Una posible forma de hacerlo es crear uno a uno los distintos campos, como en el ejemplo siguiente: » alu.nombre='Mikel' alu = nombre: 'Mikel' » alu.carnet=75482 alu = nombre: 'Mikel' carnet: 75482 » alu alu = nombre: 'Mikel' carnet: 75482

Se accede a los miembros o campos de una estructura por medio del operador punto (.), que une el nombre de la estructura y el nombre del campo (por ejemplo: alu.nombre).

También puede crearse la estructura por medio de la función struct(), como por ejemplo,

» al = struct('nombre', 'Iñaki', 'carnet', 76589)

al =

nombre: 'Iñaki' carnet: 76589

Los nombres de los campos se pasan a la función struct() entre apóstrofos ('), seguidos del valor que se les quiere dar. Este valor puede ser la cadena vacía ('') o la matriz vacía ([]).

Pueden crearse vectores y matrices (e hipermatrices) de estructuras. Por ejemplo, la sentencia,

» alum(10) = struct('nombre', 'Iñaki', 'carnet', 76589)

crea un vector de 10 elementos cada uno de los cuales es una estructura tipo alumno. Sólo el elemento 10 del vector es inicializado con los argumentos de la función struct(); el resto de los campos se inicializan con una cadena vacía o una matriz vacía11. Para dar valor a los campos de los elementos restantes se puede utilizar un bucle for con sentencias del tipo:

» alum(i).nombre='Nerea', alum(i).carnet=77524;

MATLAB permite añadir un nuevo campo a una estructura en cualquier momento. La siguiente sentencia añade el campo edad a todos los elementos del vector alum, aunque sólo se da valor al campo del elemento 5,

» alum(5).edad=18;

Para ver el campo edad en los 10 elementos del vector puede teclearse el comando:

» alum.edad

4.3.2 FUNCIONES PARA OPERAR CON ESTRUCTURAS

Las estructuras de MATLAB disponen de funciones que facilitan su uso. Algunas de estas funciones son las siguientes:

fieldnames() devuelve un vector de celdas con cadenas de caracteres que recogen los nombres de los campos de una estructura

isfield(ST,s) permite saber si la cadena s es un campo de una estructura ST isstruct(ST) permite saber si ST es o no una estructura

rmfield(ST,s) elimina el campo s de la estructura ST

getfield(ST,s) devuelve el valor del campo especificado. Si la estructura es un array hay que pasarle los índices como cell array (entre llaves {}) como segundo argumento

setfield(ST,s,v) da el valor v al campo s de la estructura ST. Si la estructura es un array, hay que pasarle los índices como cell array (entre llaves {}) como segundo argumento

MATLAB permite definir estructuras anidadas, es decir una estructura con campos que sean otras estructuras. Para acceder a los campos de la estructura más interna se utiliza dos veces el operador punto (.), como puede verse en el siguiente ejemplo, en el que la estructura clase contiene un campo que es un vector alum de alumnos,

» clase=struct('curso','primero','grupo','A', ...

'alum', struct('nombre','Juan', 'edad', 19))

clase = curso: 'primero' grupo: 'A' alum: [1x1 struct] » clase.alum(2).nombre='María'; » clase.alum(2).edad=17; » clase.alum(2) ans = nombre: 'María' edad: 17 » clase.alum(1) ans = nombre: 'Juan' edad: 19

Las estructuras se generalizan con las clases y los objetos, que no se verán en este manual.

4.4 Vectores o matrices de celdas (Cell Array)

Un vector (matriz o hipermatriz) de celdas es un vector (matriz o hipermatriz) cuyos elementos son cada uno de ellos una variable de tipo cualquiera. En un array ordinario todos sus elementos son números o cadenas de caracteres. Sin embargo, en un array de celdas, el primer elemento puede ser un número; el segundo una matriz; el tercero una cadena de caracteres; el cuarto una estructura, etc. 4.4.1 CREACIÓN DE VECTORES Y MATRICES DE CELDAS

Obsérvese por ejemplo cómo se crea, utilizando llaves {}, el siguiente vector de celdas,

» vc(1)={[1 2 3]}

vc =

[1x3 double]

» vc(2)={'mi nombre'}

vc =

[1x3 double] 'mi nombre'

» vc(3)={rand(3,3)}

vc =

Es importante que el nombre del vector de celdas vc no haya sido utilizado previamente para otra variable (si así fuera, se obtendría un error). Si es preciso se utiliza el comando clear.

Obsérvese que para crear un vector de celdas los valores asignados a cada elemento se han definido entre llaves {...}.

Otra nomenclatura alternativa y similar, que también utiliza llaves, es la que se muestra a continuación: » vb{1}=[1 2 3] vb = [1x3 double] » vb{2}='mi nombre' vb =

[1x3 double] 'mi nombre'

» vb{3}=rand(3,3)

vb =

[1x3 double] 'mi nombre' [3x3 double]

y también es posible crear el vector de celdas en una sola operación en la forma,

vcc = {[1 2 3], 'mi nombre', rand(3,3)}

vcc =

[1x3 double] 'mi nombre' [3x3 double]

4.4.2 FUNCIONES PARA TRABAJAR CON VECTORES Y MATRICES DE CELDAS MATLAB dispone de las siguientes funciones para trabajar con cell arrays:

cell(m,n) crea un cell array vacío de m filas y n columnas celldisp(ca) muestra el contenido de todas las celdas de ca

cellplot(ca) muestra una representación gráfica de las distintas celdas iscell(ca) indica si ca es un vector de celdas

num2cell() convierte un array numérico en un cell array

cell2struct() convierte un cell array en una estructura (ver Sección 4.4.3) struct2cell() convierte una estructura en un cell array (ver Sección 4.4.3) 4.4.3 CONVERSIÓN ENTRE ESTRUCTURAS Y VECTORES DE CELDAS

El siguiente ejemplo convierte el cell array vcc creado previamente en una estructura ST cuyos

campos se pasan como argumentos a la función cell2struct(). El tercer argumento (un 2) indica que

es la segunda dimensión del cell array (las columnas) la que va a dar origen a los campos de la estructura. Con posterioridad la estructura ST se convierte en un nuevo cell array llamado vbb,

» ST=cell2struct(vb,{'vector','cadena','matriz'},2)

ST =

vector: [1 2 3] cadena: 'mi nombre' matriz: [3x3 double]

» vbb = struct2cell(ST)' % hay que transponer para obtener una fila

vbb =

[1x3 double] 'mi nombre' [3x3 double]

La gran ventaja de las estructuras y los arrays de celdas es que proporcionan una gran flexibilidad para el almacenamiento de los más diversos tipos de información. El inconveniente es que se pierde parte de la eficiencia que MATLAB tiene trabajando con vectores y matrices.