40 votes

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

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

Mise à jour : La performance est la raison principale pour laquelle j'essaie de réaliser ceci. Auparavant, je disposais d'un système qui capturait les données sous forme de matrice unique, les affichait en temps réel, puis procédait au traitement de l'ensemble de données suivant.

J'ai essayé d'utiliser 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 vais devoir chercher une autre alternative pour mon cas. Je mettrai à jour les informations lorsque j'essaierai d'autres suggestions.

Mise à jour 2 : Merci à tous pour vos suggestions, mais j'aurais dû préciser à l'avance que la précision ET la rapidité sont deux facteurs essentiels. Je devrais peut-être envisager de revenir à ma méthode initiale avant d'essayer les tableaux 3-D et réévaluer la méthode d'importation des données.

0 votes

Je suppose que l'utilisation de matrices de cellules n'affectera pas du tout les performances. Puisqu'elles contiennent essentiellement des pointeurs vers les matrices réelles, leur expansion (même avec une indexation dynamique) ne devrait pas entraîner de surcharge de performance (à l'exception de la réallocation minimale d'un tableau de pointeurs, ce qui est négligeable).

72voto

Hosam Aly Points 14797

Utilisez des réseaux de cellules. Cette méthode présente l'avantage, par rapport aux matrices 3D, de ne pas exiger un espace mémoire contigu 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 type Out-of-Memory 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 rendre le tableau aussi grand que vous le souhaitez. Le surcoût de performance sera proportionnel à 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

0 votes

@HosamAly Je créais un tableau de matrices en 2D en me basant sur votre proposition. Ensuite, on m'a proposé de créer un seul tableau 4D qui est 9 fois plus performant que le premier, mais j'ai un problème de limite de mémoire avec les matrices de grande taille. Avez-vous une proposition pour expliquer ce problème ? Sujet ici stackoverflow.com/q/40052664/54964

1 votes

@Masi Désolé, je ne sais pas.

45voto

gnovice Points 70970

Si toutes les matrices doivent avoir la même taille (par exemple 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 devez utiliser la syntaxe suivante :

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

Vous pouvez ajouter d'autres matrices à myArray de plusieurs façons :

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

Si chaque matrice n'est pas de la même taille, vous devez utiliser des tableaux de cellules comme le suggère Hosam.

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 (simple 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');

3 votes

Le problème de l'utilisation d'un tableau 3D est qu'il nécessite un espace contigu en mémoire. Bien qu'il puisse avoir de meilleures performances que les tableaux de cellules, ces derniers permettent l'allocation des matrices 2D dans différents espaces mémoire, ce qui le rend plus approprié s'il est utilisé avec une mémoire fragmentée.

1voto

myArrayOfMatrices = zeros(unknown,500,800);

Si vous manquez de mémoire, ajoutez de la mémoire vive 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 doubles ou pouvez-vous vous contenter de simples ?)

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

Pour ajouter à ce tableau, essayez :

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

0voto

timday Points 14860

Je faisais du rendu de volume dans octave (clone de matlab) et je construisais mes tableaux 3D (c'est à dire un tableau de tranches 2d) à l'aide de

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

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

0 votes

Vous pouvez juste faire zeros(512,512,512,'uint16') . Il n'y a pas besoin de reshape ici, juste un appel de fonction supplémentaire.

-2voto

Rocco Points 268

Si vous savez ce qu'est l'inconnu,

vous pouvez faire quelque chose comme

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

Cependant, cela fait un moment que je n'ai pas utilisé Matlab. Cette page pourrait donc m'éclairer sur le sujet :

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

1 votes

Pour ce faire, vous avez besoin d'un tableau tridimensionnel. Votre exemple entraînerait une erreur pour cause d'incompatibilité des dimensions du tableau. Vous voulez probablement dire myArray(:,:,i) mais je ne suis pas sûr de la façon dont il se comporterait (car je n'ai pas MATLAB actuellement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X