ich oft gefunden habe ich so etwas wie dies zu tun:Wie kann ich einen nicht numerischen Vektor in MATLAB vorallokieren?
unprocessedData = fetchData(); % returns a vector of structs or objects
processedData = []; % will be full of structs or objects
for dataIdx = 1 : length(unprocessedData)
processedDatum = process(unprocessedData(dataIdx));
processedData = [processedData; processedDatum];
end
, die zwar funktional, nicht optimal ist - der processedData
Vektor innerhalb der Schleife wächst. Sogar mlint
warnt mich, dass ich eine Vorabzuweisung für die Geschwindigkeit in Betracht ziehen sollte.
Daten wurden ein Vektor von int8
, konnte ich dies tun:
% preallocate processed data array to prevent growth in loop
processedData = zeros(length(unprocessedData), 1, 'int8');
und die Schleife ändern Vektor-Slots statt verketten zu füllen.
Gibt es eine Möglichkeit, einen Vektor vorzubelegen, so dass er anschließend Strukturen oder Objekte aufnehmen kann?
Update: von Azim's answer inspiriert, ich habe einfach die Schleife Reihenfolge umgekehrt. erste Kräfte Vorbelegung des gesamten Vektors in dem ersten Treffer die letzte Elements der Verarbeitung, wie der Debugger bestätigt:
unprocessedData = fetchData();
% note that processedData isn't declared outside the loop - this breaks
% it if it'll later hold non-numeric data. Instead we exploit matlab's
% odd scope rules which mean that processedData will outlive the loop
% inside which it is first referenced:
for dataIdx = length(unprocessedData) : -1 : 1
processedData(dataIdx) = process(unprocessedData(dataIdx));
end
Dies erfordert, dass alle Objekte, die von process()
einen gültigen Null-args Konstruktor zurückgegeben seit MATLAB initialisiert processedData
auf das erste Schreiben mit realen Objekten.
mlint
klagt noch über mögliche Array Wachstum, aber ich denke, das ist, weil es die umgekehrte Schleifeniterationslatenzzeit nicht erkennen kann ...
+1 Dies ist eine Situation, für die repmat nützlich ist. – Azim