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.
By
Doug Hull
Doug first used MATLAB in 1994, could not figure it out until he got some help in 1995. He is now dedicated to making sure that no one else wastes a year of their life not knowing MATLAB like he did.
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?
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.
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
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.
Leave a Reply
About
Doug Hull is a proud MathWorker who is on a mission to help you with MATLAB.
Wouldn’t that solution force the entire array to be reshuffled every time a new value is added?
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?
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
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
@Remco,
This is the kind of thing that makes an excellent MATLAB Central File Exchange entry if you are willing to share.
Thanks,
Doug
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.