Recursive vector operation without for loops

18 views (last 30 days)
Sometimes one want to create a vector from some recursive expression, for example when we have fibonacci:
x(0)=0, x(1)=1, x(i)=x(i-1)+x(i-2)
Is there a function in matlab which creates arrays recursively, for example:
fib = recursivevector(start=[0,1], expr=@(i,x) x(1)+x(2), len=20)
Or, a bit more complicated, we already have some vector and want to change it recursively, as is done in a exponential smoothing filter:
x2(1) = x(1), x2(i) = a*x(i) + (1-a)*x2(i-1)
Which we could then execute as:
denoised = recursivevector(start=[noised(1)], expr=@(i,x) a*x(1)+(1-a)*noised(2), len=length(noised))
In for-loops this would go like this:
function y = exponentialdenoise(x,a)
for i=2:length(x)
I strongly dislike the for-loops ;) of course and prefer a version without them.

Accepted Answer

Azzi Abdelmalek
Azzi Abdelmalek on 11 Jul 2013
Edited: Azzi Abdelmalek on 11 Jul 2013
Your equation can be written as:
%x(i)-x(i-1)-x(i-2)=u(i) with u(i)=0
D=[1 -1 -1];
y=filter(N,D,zeros(1,10),[0 1])
Jan on 11 Jul 2013
And if run-time matters, you can try: FEX: FilterM.

Sign in to comment.

More Answers (1)

Jan on 11 Jul 2013
Why do you dislike loops? They solve problems efficiently. And yes, sometimes there are even faster methods.
function y = exponentialdenoise(x,a)
y = zeros(size(x));
y(1) = x(1);
n = length(x);
y(2:n) = a * x(2:n) - (1-a) * x(1:n-1);
  1 Comment
Herbert on 11 Jul 2013
I made a mistake in my maltab code, sorry, this is not what I am looking for. I want y(i-1) at the right side of the =.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!