2 votes

Matlab : Croissance d'un tableau à l'intérieur d'une boucle - et alors ?

J'ai le code suivant (lecture d'images dans une énorme matrice)

allImages = [];
for ii = 1 : n
    img = imread( fileNames{ii} );
    img = imresize( rgb2gray(img), [100 100] );
    allImages = cat(3, allImages, img ); % append image to huge matrix
end

Matlab me renvoie à la dernière ligne de la boucle en m'avertissant que allIamges se développe à l'intérieur de la boucle.

Quel est donc le problème ?

6voto

Shai Points 24484

Il s'agit d'une affaire importante.

En termes d'exactitude, le code fait ce qui est attendu. La question qui se pose ici est celle de la performance.

Que se passe-t-il en coulisses ?

Lorsqu'une nouvelle image est ajoutée à allImages Matlab doit trouver une contiguës région de la mémoire (c'est-à-dire en un seul morceau) pour la région de allImages . Cela implique généralement une nouvelle allocation de mémoire pour le fichier redimensionné. allImages La copie des anciennes données et la désaffectation des anciennes données. allImages .
Ces opérations de réallocation et de copie qui se déroulent en coulisses (probablement à chaque itération !) peuvent prendre beaucoup de temps.


Que peut-on faire ?

1. Pré-allocation : Si vous connaissez le nombre d'images et la taille finale de l'image. allImages Pour cela, il faut réserver cet espace à l'avance :

allImages = zeros( 100, 100, n ); % pre-allocate, fill with zeros.
for ii = 1 : n
    % ...
    allImages(:,:, ii ) = img; % write into pre-allocated array
end

2. Et si je ne sais pas n à l'avance ? : Plusieurs questions traitent déjà de ce sujet. Il s'agit par exemple de cette réponse .

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