web-dev-qa-db-fra.com

Octave / Matlab: Ajouter de nouveaux éléments à un 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; 

et

x = [x newElem];

?

71
URL87

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

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

En général cependant, les vecteurs en croissance devraient être évités. Si vous faites cela souvent, votre code risque de ne pas être analysé. Pensez-y: développer un tableau implique d'allouer un nouvel espace, de tout copier, d'ajouter un nouvel élément et de nettoyer le désordre actuel ... Une perte de temps inutile si vous connaissiez auparavant la taille correcte :)

90
ThijsW

Pour ajouter à la réponse de @ ThijsW, la première méthode présente un avantage considérable en termes de rapidité 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 eu ces temps en cours d'exécution en 2012b mais quand j'ai couru le même code sur le même ordinateur dans Matlab 2010a je reçois

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

Donc, je suppose que l’avantage de la vitesse ne s’applique qu’aux versions plus récentes de Matlab

26
Dan

Comme mentionné précédemment, l'utilisation de x(end+1) = newElem présente l'avantage de vous permettre de concaténer votre vecteur avec un scalaire, que votre vecteur soit transposé ou non. Par conséquent, il est 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. En outre, cela se généralise un peu plus naturellement au cas où vous souhaitez concaténer des matrices. M = [M M1 M2 M3]


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

 x(end+(1:numel(newElem)))=newElem
4
Dennis Jaheruddin