Mit einem Vektor muss x
ich ein Element hinzufügen ( newElem
).
Gibt es einen Unterschied zwischen -
x(end+1) = newElem;
und
x = [x newElem];
?
Antworten:
x(end+1) = newElem
ist etwas robuster.
x = [x newElem]
funktioniert nur x
, wenn es sich um einen Zeilenvektor handelt, wenn es sich um einen Spaltenvektor handelt x = [x; newElem]
. x(end+1) = newElem
Funktioniert jedoch sowohl für Zeilen- als auch für Spaltenvektoren.
Im Allgemeinen sollten jedoch wachsende Vektoren vermieden werden. Wenn Sie dies häufig tun, wird Ihr Code möglicherweise gecrawlt. Denken Sie darüber nach: Um ein Array zu vergrößern, müssen Sie neuen Speicherplatz zuweisen, alles kopieren, das neue Element hinzufügen und das alte Durcheinander beseitigen ... Eine ziemliche Zeitverschwendung, wenn Sie vorher die richtige Größe kannten :)
x
(von Größe n
) haben" erwähnte , nahm ich an n
, dass er nicht Null ist und der Vektor bereits initialisiert wurde :)
end
anstelle einer Variablen n
(die global
nach allem, was Sie wissen , eine sein könnte !) Der universellere, robustere und kostengünstigere Weg
x(end+1)=...
ohne x
Initialisierung auskommen und ich bin fast sicher, dass Sie es auch in MATLAB tun können
Um die Antwort von @ ThijsW zu ergänzen, bietet die erste Methode einen erheblichen Geschwindigkeitsvorteil gegenüber der Verkettungsmethode:
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.
Ich habe diese Zeiten in 2012b ausgeführt, aber als ich den gleichen Code auf demselben Computer in matlab 2010a ausgeführt habe, den ich bekomme
Elapsed time is 0.003044 seconds.
Elapsed time is 0.009947 seconds.
Elapsed time is 12.013875 seconds.
Elapsed time is 12.165593 seconds.
Ich denke, der Geschwindigkeitsvorteil gilt nur für neuere Versionen von Matlab
x(end+1)
Fall eine ziemlich neue Ergänzung ist (R2012a oder so ...). Ich erinnere mich vage daran, dass ich so etwas in einigen Changenotes am Smoe Point gelesen habe. Ich bekomme auch sehr unterschiedliche Ergebnisse auf meiner APU / Matlab R2010, aber ich bin nicht sicher, ob das an der Matlab-Version oder der APU liegt ...
Wie bereits erwähnt, hat die Verwendung von x(end+1) = newElem
den Vorteil, dass Sie Ihren Vektor mit einem Skalar verketten können, unabhängig davon, ob Ihr Vektor transponiert ist oder nicht. Daher ist es robuster für das Hinzufügen von Skalaren.
Was jedoch nicht vergessen werden sollte, ist, dass dies x = [x newElem]
auch funktioniert, wenn Sie versuchen, mehrere Elemente gleichzeitig hinzuzufügen. Darüber hinaus verallgemeinert sich dies etwas natürlicher auf den Fall, in dem Sie Matrizen verketten möchten.M = [M M1 M2 M3]
Alles in allem, wenn Sie eine Lösung wollen , dass Sie Ihre bestehenden Vektor verketten ermöglicht x
mit , newElem
dass kann oder auch nicht ein Skalar sein kann, sollte dies den Trick:
x(end+(1:numel(newElem)))=newElem
x
muss zuerst initialisiert werden!