¿Cómo puedo definir una estructura en Matlab?

Sé que una estructura se puede definir de varias maneras, como por ejemplo:

  1. Agregar campos a una variable

    p.color.red = .2; p.color.green = .4; p.color.blue = .7; 
  2. Definir una estructura escalar por asignación

     S = struct('a', 0, 'b', 1, 'c', 2); 

Lo que quiero poder hacer es crear una definición de estructura (como C). Mi objective final es tener una matriz de estructuras que pueda repetir y realizar pruebas. ¿Hay alguna manera de que pueda definir una estructura genérica y luego crear instancias de la misma? Debería usar algún otro mecanismo. Sé que MATLAB admite Java, ¿debería usar una clase / interfaz?

A diferencia de C, Matlab le permite agregar o quitar miembros de una estructura sobre la marcha. Es más una convención que una estructura con ciertos campos se puede usar con ciertas funciones.

Entonces sí, esas son las dos formas básicas de crear estructuras. Por supuesto, siempre puede escribir una función en un archivo * .m que crea una estructura con ciertos campos para usted. O si quieres obtener más OO, mira aquí

Usted mencionó que su objective era trabajar con varias estructuras del mismo tipo, por lo tanto, debe conocer los dos enfoques principales disponibles para usted y cómo se comparan:

1) matriz de estructuras

Puede inicializarlo haciendo crecer la matriz dinámicamente

 p(1).str = 'white'; p(1).r = 1; p(1).g = 1; p(1).b = 1; p(2).str = 'black'; p(2).r = 0; p(2).g = 0; p(2).b = 0; 

Sin embargo, siempre es mejor comenzar por preasignar la matriz

 p = repmat( struct('r',[], 'g',[], 'b',[], 'str',[]), 1, 10); 

otro truco para preasignar:

 p(10) = struct('r',[], 'g',[], 'b',[], 'str',[]); 

O incluso dar todos los valores en la inicialización:

 p = struct('r',{1 0}, 'g',{1 0}, 'b',{1 0}, 'str',{'white' 'black'}); 

Una forma simple de llenar valores

 names = {'white' 'black'}; [p(1:2).str] = names{:}; red = num2cell([1 0]); [p(1:2).r] = red{:}; 

A continuación, le mostramos cómo recuperar todos los valores de un campo:

 red = [p(:).r]; names = {p(:).str}; 

2) estructuras de matrices

 pr = [1 0]; pg = [1 0]; pb = [1 0]; p.str = {'white' 'black'}; p1 = [pr(1) pg(1) pb(1)]; 

La ventaja de esto es que la estructura es simplemente una matriz de puntero (r, g, b, str se almacenan por separado en la memoria). Compare esto con el enfoque anterior, donde tenemos una matriz de estructura, y cada estructura tiene punteros a su campo (hay bastante sobrecarga de memoria):

 >> s1 = repmat( struct('r',0, 'g',0, 'b',0), 1, 1000); >> s2 = struct('r',zeros(1,1000), 'g',zeros(1,1000), 'b',zeros(1,1000)); >> whos Name Size Bytes Class Attributes s1 1x1000 204192 struct s2 1x1 24372 struct 

Por otro lado, dado que cada uno de los campos de una estructura se almacena como una matriz propia, depende de usted hacer cumplir el hecho de que tienen que coincidir en longitud.

Algunas otras publicaciones si quieres leer más sobre esto:

  • Fundamentos de MATLAB: Matriz de estructuras vs Estructuras de matrices
  • Inicialización de estructura