필터 지우기
필터 지우기

Fast FIFO Array/Other Datatype

조회 수: 37 (최근 30일)
Matthew Mellor
Matthew Mellor 2016년 6월 14일
편집: Andrew Ward 2018년 11월 27일
I'm trying to plot something in real time using an FIFO array. I'm implementing the array using the advice someone else here gave me (thank you!) of the following sort:
array = {1,2,3,4};
array = array(2:end)
array{end+1} = 5
Unfortunately this is a bit too slow for what I'm trying to do :(. Could anyone suggest either an efficient FIFO array-like data structure? Or just a faster way?
  댓글 수: 2
Adam
Adam 2016년 6월 14일
You could probably also use a containers.Map though I don't know what its speed would be like compared to your approach or Walter's answer which is probably faster since it uses a raw array without memory copying.

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2016년 6월 14일
array(1:end-1) = array(2:end);
array{end} = newvalue;
This avoids having to grow the array.
  댓글 수: 2
Matthew Mellor
Matthew Mellor 2016년 6월 15일
Thanks so much!
Kunle Olutomilayo
Kunle Olutomilayo 2017년 6월 24일
Awesome.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Andrew  Ward
Andrew Ward 2018년 11월 27일
편집: Andrew Ward 2018년 11월 27일
Nmax=50000;
A1=1:Nmax;
Ap=A1;
%%
%Method 1 concatenate array with element - Slow
tic
for i=1:Nmax
A1=[A1(2:end),Nmax+i];
end
toc
%%
%% Method 2 overwite ellemnts followed by a circular shift - Fastest -
% avoids taking a sub portion of the array
% which I think is costly, just replaces the value, 1,2,3,4
% becomes 5,2,3,4, so to get it in order you need to
% do the circular shift at the end.
tic
A2=1:Nmax;
for i=1:Nmax
ic=mod(i,Nmax+1);
A2(ic)=Nmax+i;
end
A2=circshift(A2,-i);
toc
sum(A2~=A1)
%% Method from above, still slow
A3=Ap;
tic
for i=1:Nmax
A3(1:end-1)=A3(2:end);
A3(end)=Nmax+i;
end
toc
sum(A3~=A1);

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by