Filter löschen
Filter löschen

Recursive vector operation without for loops

2 Ansichten (letzte 30 Tage)
Herbert
Herbert am 11 Jul. 2013
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)
y=zeros(size(x));
y(1)=x(1);
for i=2:length(x)
y(i)=a*x(i)+(1-a)*y(i-1);
end
end
I strongly dislike the for-loops ;) of course and prefer a version without them.

Akzeptierte Antwort

Azzi Abdelmalek
Azzi Abdelmalek am 11 Jul. 2013
Bearbeitet: Azzi Abdelmalek am 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];
N=1
y=filter(N,D,zeros(1,10),[0 1])
  4 Kommentare
Herbert
Herbert am 11 Jul. 2013
Bearbeitet: Herbert am 11 Jul. 2013
I resolved it as:
exponentialdenoise = @(x, a) filter([a 0], [1, -(1-a)], x, 0)
Which is equivalent to what you say (with a factor -1), only my initial condition (which I determined empirically) needs to be 0 to set y(1)=x(1).
Jan
Jan am 11 Jul. 2013
And if run-time matters, you can try: FEX: FilterM.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Jan
Jan am 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);
end
  1 Kommentar
Herbert
Herbert am 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 =.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by