Come definisco una struttura in Matlab

So che una struttura può essere definita in diversi modi, ad esempio:

  1. Aggiunta di campi a una variabile

    p.color.red = .2; p.color.green = .4; p.color.blue = .7; 
  2. Definizione di una struttura scalare per assegnazione

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

Quello che voglio essere in grado di fare è creare una definizione di struttura (come C). Il mio objective finale è avere una serie di strutture che posso scorrere e testare. C’è un modo per definire una struttura generica e quindi crearne delle istanze? Dovrei usare qualche altro meccanismo. So che MATLAB supporta Java, dovrei usare una class / interfaccia?

A differenza di C, Matlab consente di aggiungere o rimuovere membri da una struttura mentre si va. È più di una convenzione che una struttura con determinati campi può essere utilizzata con determinate funzioni.

Quindi sì, quelli sono i due modi fondamentali per creare strutture. Naturalmente, puoi sempre scrivere una funzione in un file * .m che crea una struttura con determinati campi per te. O se vuoi ottenere più OO, guarda qui

Hai detto che il tuo objective era di lavorare con diverse strutture dello stesso tipo, quindi dovresti essere consapevole dei due principali approcci disponibili e del loro confronto:

1) serie di strutture

È ansible inizializzarlo aumentando l’array in modo dinamico

 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; 

Tuttavia è sempre meglio iniziare con la pre-allocazione dell’array

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

un altro trucco da pre-allocare:

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

O anche dare tutti i valori all’inizializzazione:

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

Un modo semplice per riempire i valori

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

Ecco come recuperi tutti i valori di un campo:

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

2) strutture di array

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

Il vantaggio di questo è che la struttura è semplicemente una matrice di puntatori (r, g, b, str sono memorizzati separatamente nella memoria). Confrontiamo questo con l’approccio precedente, dove abbiamo una matrice di struttura, e ogni struttura ha dei puntatori al suo campo (c’è un sovraccarico di 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 

D’altra parte, poiché ciascuno dei campi di una struttura è memorizzato come una propria matrice, spetta a te far rispettare il fatto che devono corrispondere in lunghezza.

Alcuni altri post se vuoi saperne di più su questo:

  • Nozioni di base su MATLAB: matrice di strutture o strutture di array
  • Inizializzazione della struttura