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];
?
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];
?
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 :)
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.
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 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.