Matrice di matrici in MATLAB

Sto cercando un modo per memorizzare un grande numero variabile di matrici in una matrice in MATLAB.

Ci sono dei modi per raggiungere questo objective?

Esempio:

for i: 1:unknown myArray(i) = zeros(500,800); end 

Dove sconosciuta è la lunghezza varia della matrice, posso rivedere con ulteriori informazioni se necessario.

Aggiornamento: le prestazioni sono la ragione principale per cui sto cercando di ottenere questo risultato. L’ho avuto prima di dove prendere i dati come una singola matrice, mostrarlo in tempo reale e quindi procedere per elaborare il prossimo insieme di dati.

L’ho provato usando array multidimensionali come suggerito di seguito da Rocco, tuttavia i miei dati sono così grandi che ho esaurito la memoria, potrei dover cercare un’altra alternativa per il mio caso. Aggiornerà mentre cerco altri suggerimenti.

Aggiornamento 2: Grazie a tutti per i suggerimenti, tuttavia dovrei aver specificato in precedenza, la precisione e la velocità sono entrambi fattori fondamentali qui, potrei dover cercare di tornare al mio metodo originale prima di provare gli array 3-d e rivalutare il metodo per importare i dati.

Se tutte le matrici avranno la stessa dimensione (es. 500×800), allora puoi semplicemente creare un array 3D:

 nUnknown; % The number of unknown arrays myArray = zeros(500,800,nUnknown); 

Per accedere a un array, si utilizza la seguente syntax:

 subMatrix = myArray(:,:,3); % Gets the third matrix 

Puoi aggiungere più matrici a myArray in due modi:

 myArray = cat(3,myArray,zeros(500,800)); % OR myArray(:,:,nUnknown+1) = zeros(500,800); 

Se ciascuna matrice non avrà le stesse dimensioni, sarà necessario utilizzare gli array di celle come suggerito da Hosam.

EDIT: Ho perso la parte sulla mancanza di memoria. Immagino che il tuo nUnknown sia abbastanza grande. Potrebbe essere necessario cambiare il tipo di dati delle matrici (singolo o anche un tipo uintXX se si utilizzano numeri interi). Puoi farlo nella chiamata agli zeri:

 myArray = zeros(500,800,nUnknown,'single'); 

Usa gli array di celle. Ciò ha un vantaggio rispetto agli array 3D in quanto non richiede uno spazio di memoria contiguo per memorizzare tutte le matrici. In effetti, ciascuna matrice può essere memorizzata in uno spazio diverso in memoria, il che ti farà risparmiare dagli errori di memoria insufficiente se la memoria libera è frammentata. Ecco una funzione di esempio per creare le tue matrici in un array di celle:

 function result = createArrays(nArrays, arraySize) result = cell(1, nArrays); for i = 1 : nArrays result{i} = zeros(arraySize); end end 

Per usarlo:

 myArray = createArrays(requiredNumberOfArrays, [500 800]); 

E per accedere ai tuoi elementi:

 myArray{1}(2,3) = 10; 

Se non si è in grado di conoscere il numero di matrici in anticipo, è sufficiente utilizzare l’indicizzazione dynamic di MATLAB per rendere l’array grande quanto necessario. L’overhead delle prestazioni sarà proporzionale alla dimensione dell’array di celle e non è influenzato dalle dimensioni delle matrici stesse. Per esempio:

 myArray{1} = zeros(500, 800); if twoRequired, myArray{2} = zeros(500, 800); end 

myArrayOfMatrices = zero (sconosciuto, 500,800) se stai esaurendo la memoria scarica più ram nel tuo sistema e assicurati di avere un sistema operativo a 64 bit. Prova anche a ridurre la tua precisione (hai davvero bisogno di raddoppiare o puoi cavarcanvas con single: myArrayOfMatrices = single (sconosciuto, 500.800);

Per aggiungere a quell’array, prova: myArrayOfMatrices (unknown + 1,:, 🙂 = zeros (500,800);

Stavo facendo un po ‘di rendering del volume in ottava (clone matlab) e costruendo i miei array 3D (cioè un array di sezioni 2d) usando

 buffer=zeros(1,512*512*512,"uint16"); vol=reshape(buffer,512,512,512); 

Il consumo di memoria sembrava efficiente. (non posso dire lo stesso per la successiva velocità dei calcoli: ^)

se sai cosa è sconosciuto,

puoi fare qualcosa del genere

 myArray = zeros(2,2); for i: 1:unknown myArray(:,i) = zeros(x,y); end 

Comunque è passato un po ‘di tempo dall’ultima volta che ho usato Matlab. quindi questa pagina potrebbe far luce sulla questione:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_prog/f1-86528.html

fallo così

 x=zeros(100,200); for i=1:100 for j=1:200 x(i,j)=input('enter the number'); end end