web-dev-qa-db-fra.com

Tableau de matrices dans MATLAB

Je cherche un moyen de stocker un grand nombre variable de matrices dans un tableau dans MATLAB.

Existe-t-il des moyens d'y parvenir?

Exemple:

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

Lorsque la longueur variée du tableau est inconnue, je peux réviser avec des informations supplémentaires si nécessaire.

Mise à jour: les performances sont la principale raison pour laquelle j'essaie d'accomplir cela. Je l'avais auparavant, où il saisirait les données sous forme de matrice unique, les afficherait en temps réel, puis procéderait au traitement de l'ensemble de données suivant.

Je l'ai essayé en utilisant des tableaux multidimensionnels comme suggéré ci-dessous par Rocco, mais mes données sont si grandes que je n'ai plus de mémoire, je devrai peut-être chercher une autre alternative pour mon cas. Mettra à jour lorsque j'essaierai d'autres suggestions.

Mise à jour 2: Merci à tous pour vos suggestions, mais j'aurais dû préciser au préalable, la précision ET la vitesse sont tous deux un facteur intégral ici, je devrai peut-être revenir à ma méthode d'origine avant d'essayer des tableaux 3D et de réévaluer la méthode pour importer les données.

39
user57685

Si toutes les matrices vont être de la même taille (c'est-à-dire 500x800), vous pouvez simplement créer un tableau 3D:

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

Pour accéder à un tableau, vous utiliseriez la syntaxe suivante:

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

Vous pouvez ajouter plusieurs matrices à myArray de deux manières:

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

Si chaque matrice ne va pas être de la même taille, vous devrez utiliser des tableaux de cellules comme Hosam l'a suggéré.

EDIT: J'ai raté la partie sur le manque de mémoire. Je suppose que votre nUnknown est assez grand. Vous devrez peut-être changer le type de données des matrices (un seul ou même un type uintXX si vous utilisez des entiers). Vous pouvez le faire dans l'appel aux zéros:

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

Utilisez des tableaux de cellules. Cela présente un avantage sur les tableaux 3D en ce qu'il ne nécessite pas n espace mémoire contig pour stocker toutes les matrices. En fait, chaque matrice peut être stockée dans un espace différent en mémoire, ce qui vous évitera des erreurs de mémoire insuffisante si votre mémoire libre est fragmentée. Voici un exemple de fonction pour créer vos matrices dans un tableau de cellules:

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

Pour l'utiliser:

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

Et pour accéder à vos éléments:

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

Si vous ne pouvez pas connaître le nombre de matrices à l'avance, vous pouvez simplement utiliser l'indexation dynamique de MATLAB pour agrandir le tableau selon vos besoins. La surcharge de performances sera proportionnelle à la taille du tableau cellule et n'est pas affectée par la taille des matrices elles-mêmes. Par exemple:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
70
Hosam Aly
myArrayOfMatrices = zeros(unknown,500,800);

Si vous manquez de mémoire, jetez plus RAM dans votre système, et assurez-vous que vous utilisez un système d'exploitation 64 bits. Essayez également de réduire votre précision (avez-vous vraiment besoin de doublons ou pouvez-vous vous en sortir avec des célibataires?):

myArrayOfMatrices = zeros(unknown,500,800,'single');

Pour ajouter à ce tableau, essayez:

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);
1
joe

Je faisais du rendu de volume en octave (clone matlab) et je construisais mes tableaux 3D (c'est-à-dire un tableau de tranches 2D) en utilisant

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

La consommation de mémoire semble être efficace. (ne peut pas en dire autant pour la vitesse de calcul suivante: ^)

0
timday