# Doug's MATLAB Video Tutorials

## Implementing a simple circular buffer

Internet explorer users: Please follow the permalink at the bottom of this post to see the correct video… We are working on this! Sorry! I frequent StackOverflow.com answering MATLAB question. Here is the answer to one that recently went by. In this three minute video I show how to implement a circular buffer for keeping a limited time history. This is useful for keeping only the history that you need for a variable. A strip chart could be plotted from one of these.

### 6 Responses to “Implementing a simple circular buffer”

1. Petter replied on :

Wouldn’t that solution force the entire array to be reshuffled every time a new value is added?

2. Daniel Armyr replied on :

Like Petter, I wonder if this should be considdered an efficient implementation or only an easy one?

I use a few rinbuffers here and there and they are all implemented like this, because it is easy. However, the line buffer = [newValue buffer(1:end-1)] gives the optimizer in me the shivers. Is that just me?

3. dhull replied on :

I profiled this with a really large amount of data, more iterations and longer buffer. That part of the video is on the “cutting room floor”. Basically, there is a negligible performance hit. To be a real test, it would need to be done in context to see if this architecture is a problem.

This video is in keeping with one of the central themes of my programming style: “Avoid premature optimization”. If I were to try and avoid the churn that this circular buffer goes through, the complexity and readability would suffer.

-Doug

4. Remco replied on :

Hi All,

I am not sure if this is still relevant but yes the discussed implementation is very inefficient. I have created a buffer class in matlab because I need multiple
circular buffers. This buffer class implements the buffer, display, and subsref functions in matlab code and the push_front and push_back functions in c code. This is because you cannot pass arguments by reference in Matlab. Matlab only makes a copy of the arguments when the arguments change inside a m file. But since you add an element to the buffer Matlab does make a copy. In a c mex implementation this does not happen and one can efficiently add a new element. Also I use a double length circular buffer to allow for linear adressing instead of circular buffer adressing

5. dhull replied on :

@Remco,

This is the kind of thing that makes an excellent MATLAB Central File Exchange entry if you are willing to share.

Thanks,
Doug

6. Steve Eddins replied on :

Remco—I recently implemented a double-ended queue class using a circular buffer. Because I subclassed handle, no data copies are made. My push_front and push_back (don’t remember if I actually used those names) manipulate an internal circular buffer directly. A copy gets made only when the buffer gets full and has to be resized, but that happens in a C++ implementation as well.

 Name (required) E-mail (required, will not be published) Website (optional) Spam protection (required): What is 3 + 5 ?

Wrap code fragments inside <pre> tags, like this:

<pre class="code">
a = magic(3);
sum(a)
</pre>


If you have a "<" character in your code, either follow it with a space or replace it with "&lt;" (including the semicolon).

Doug Hull is a proud MathWorker who is on a mission to help you with MATLAB.

These postings are the author's and don't necessarily represent the opinions of MathWorks.