74 votes

Matlab - ajouter un élément au vecteur

Avoir un vecteur x et je dois ajouter un élément ( newElem ) .

Y a-t-il une différence entre -

x(end+1) = newElem; 

y

x = [x newElem];

?

91voto

ThijsW Points 1504

x(end+1) = newElem est un peu plus robuste.

x = [x newElem] ne fonctionnera que si x est un vecteur ligne, si c'est un vecteur colonne x = [x; newElem] doit être utilisé. x(end+1) = newElem fonctionne cependant pour les vecteurs de lignes et de colonnes.

En général, cependant, les vecteurs de croissance doivent être évités. Si vous le faites souvent, votre code risque de se dégrader. Pensez-y : la croissance d'un tableau implique l'allocation d'un nouvel espace, la copie de tout, l'ajout du nouvel élément et le nettoyage de l'ancien... Une perte de temps considérable si vous connaissez la taille correcte à l'avance :)

27voto

Dan Points 18107

Pour compléter la réponse de @ThijsW, la première méthode présente un avantage significatif en termes de vitesse par rapport à la méthode de concaténation :

big = 1e5;
tic;
x = rand(big,1);
toc

x = zeros(big,1);
tic;
for ii = 1:big
    x(ii) = rand;
end
toc

x = []; 
tic; 
for ii = 1:big
    x(end+1) = rand; 
end; 
toc 

x = []; 
tic; 
for ii = 1:big
    x = [x rand]; 
end; 
toc

   Elapsed time is 0.004611 seconds.
   Elapsed time is 0.016448 seconds.
   Elapsed time is 0.034107 seconds.
   Elapsed time is 12.341434 seconds.

J'ai obtenu ces temps en 2012b, mais lorsque j'ai exécuté le même code sur le même ordinateur en matlab 2010a, j'ai obtenu les résultats suivants

Elapsed time is 0.003044 seconds.
Elapsed time is 0.009947 seconds.
Elapsed time is 12.013875 seconds.
Elapsed time is 12.165593 seconds.

Je suppose donc que l'avantage en termes de vitesse ne s'applique qu'aux versions plus récentes de Matlab.

4voto

Dennis Jaheruddin Points 10154

Comme mentionné précédemment, l'utilisation de x(end+1) = newElem a l'avantage de vous permettre de concaténer votre vecteur avec un scalaire, que votre vecteur soit transposé ou non. Elle est donc plus robuste pour l'ajout de scalaires.

Cependant, il ne faut pas oublier que x = [x newElem] fonctionnera également lorsque vous essayez d'ajouter plusieurs éléments à la fois. De plus, cela se généralise un peu plus naturellement au cas où vous voulez concaténer des matrices. M = [M M1 M2 M3]


En somme, si vous voulez une solution qui vous permette de concaténer votre vecteur existant x avec newElem qui peut être ou non un scalaire, cela devrait faire l'affaire :

 x(end+(1:numel(newElem)))=newElem

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