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

0

Mam jakas funkcje f(x) = x^2

w matlabie mozemy ja utworzyc jako funkcje anonimowa:

 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:

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....

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:

>> 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:

>> 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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1