Innym podejściem, które ma na uwadze wydajność, a jednocześnie stara się być przestrzeń efektywny, jest przydzielenia pamięci w dużych partiach, dodając więcej partie ile potrzeba. Jest to dobrze dopasowane, jeśli musisz dodać dużą liczbę przedmiotów, nie wiedząc, ile wcześniej.
BLOCK_SIZE = 2000; % initial capacity (& increment size)
listSize = BLOCK_SIZE; % current list capacity
list = zeros(listSize, 2); % actual list
listPtr = 1; % pointer to last free position
while rand<1-1e-5 % (around 1e5 iterations on avrg)
% push items on list
list(listPtr,:) = [rand rand]; % store new item
listPtr = listPtr + 1; % increment position pointer
% add new block of memory if needed
if(listPtr+(BLOCK_SIZE/10) > listSize) % less than 10%*BLOCK_SIZE free slots
listSize = listSize + BLOCK_SIZE; % add new BLOCK_SIZE slots
list(listPtr+1:listSize,:) = 0;
end
end
list(listPtr:end,:) = []; % remove unused slots
EDIT: Dla porównania w czasie, należy rozważyć następujące przypadki:
- Ten sam kod jak wyżej zrobić dla 50000 iteracji.
- Preallocating całą macierz uprzednio:
list = zeros(50000,2); list(k,:) = [x y];
- dynamicznie dodanie wektorów do macierzy:
list = []; list(k,:) = [x y];
moim komputerze, wyniki były następujące:
1) Upływający czas jest 0,080214 sekundy.
2) Upływający czas wynosi 0,065513 sekund.
3) Upływający czas to 24.433315 sekund.
Aktualizacja:
Po dyskusji w komentarzach, ja ponownie uruchomić kilka testów z wykorzystaniem najnowszej wersji R2014b. Wniosek jest taki, że ostatnie wersje programu MATLAB znacznie poprawiły wydajność automatycznego zwiększania macierzy!
Jest jednak haczyk; tablica musi rosnąć w ostatnim wymiarze (kolumny w przypadku macierzy 2D). Dlatego dołączanie wierszy, jak pierwotnie zamierzano, jest wciąż zbyt wolne bez wcześniejszej alokacji. To jest miejsce, w którym powyższe proponowane rozwiązanie może naprawdę pomóc (poprzez rozszerzenie tablicy w partiach).
Patrz tutaj dla pełnego zestawu testów: https://gist.github.com/amroamroamro/0f104986796f2e0aa618
również, jeżeli jest to dla przypisania klasy i trzeba pokazać iteracji; możesz użyć sprintf w swojej implementacji Eulera. – ccook
Inne powiązane pytanie: [Dołączanie wektora do pustej macierzy MATLAB] (http://stackoverflow.com/q/781410/97160) – Amro