[MATLAB] ziterowanie wywolania funkcji od funkcji anonimowej...

[MATLAB] ziterowanie wywolania funkcji od funkcji anonimowej...
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam jakas funkcje f(x) = x^2

w matlabie mozemy ja utworzyc jako funkcje anonimowa:

Kopiuj
 fh = @(x) x^2;
 

jak wiemy z matematyki f(f(x)) = (x2 )2 = x4
i dalej: f(f(f(x))) = ((x2)2)2 = x8

jak teraz ziterowac sobie takie wywolanie ?
doszedlem jedynie do momentu utworzenia funkcji anonimowej ale juz nie potrafie zwrocic funkcji iterujaca ja:

Kopiuj
fh = @(x) x^2;
F = @(n) fh(n);
 

czyli generalnie za 1-teracja mamy otrzymac to co na wejsciu czyli x2, za 2-ga: x4, za trzecia x8, etc....

  • Rejestracja: dni
  • Ostatnio: dni
0

Nie jestem ekspertem od matlaba, ale można tak:
g=@(func,arg,iter)eval([repmat('func(',1,iter), int2str(arg),repmat(')',1,iter)]);
Wtedy możemy policzyć na przykład f(f(f(f(2)))) z Twojego przykładu:

Kopiuj
>> g(@(x)x^2,2,4)
ans = 
       65536

Funkcja g(...) jest nawet nieco uniwersalna, bo funkcja iterowana też jest argumentem.
Pozostaje pytanie, czy taka struktura jest użyteczna/przejrzysta. Często znacznie prościej użyć pętli, funkcji zagnieżdżonej itp. Zwłaszcza, że interpreter Matlaba nie przepada za takimi potworkami. Iterowanie funkcji to niezbyt efektywna droga w pracy w Matlabie.
Niemniej można poćwiczyć sobie pracę z uchwytami funkcji tworząc choćby funkcję anonimową zwracającą dany element ciągu Fibbonaciego:

Kopiuj
>> s1=@(x)[x(2),x(1)+x(2)];
>> s2=@(fun,n)min(eval([repmat('fun(',1,n),'[0,1]',repmat(')',1,n)]));
>> fibbonaci=@(n)s2(s1,n);
>> clear s1 s2     %funkcja fibbonaci zadziała bez tych definicji, choć w workspace wygląda to zagadkowo
>> for k=1:10, disp(fibbonaci(k)), end
     1  1  2  3  5  8  13  21  34  55 

choć są oczywiście znacznie prostsze sposoby.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.