2016-03-30 36 views
3

過去の出力を新しい入力として使用して、繰り返し関数を適用したい。読みやすさのために(私はプログラマの視点ではなく、数学の観点から書いています)、完全な関数ブロックではなく単純な無名関数として定義したいと思います。だから、代わりに私がMATLABで再帰的な無名関数を使用することはできますか?

[email protected](x,n) ???? 

を書くことができるようにしたいと思い

function f=myfun(x,n) 
    if n>1 
     f=myfun(myfun(x,n-1),1); 
    else 
     f=expression(x); 
    end 
end 

のようなもので、これが可能である方法はありますか?

+0

次のことが可能に関数ハンドルを作成しますが、私はあなたがしたい疑います。 [Loren Shureの匿名関数を使った関数型プログラミングに関する記事](http://blogs.mathworks.com/loren/2013/01/10/introduction-to-functional-programming-with-anonymous-functions-part- 1 /#c8d04efb-1a2d-4c35-afff-dd52e6c660d2)、特に「インライン条件」セクション。 – Dan

答えて

8

MATLABで再帰匿名関数を使用する唯一の方法は、自身の関数ハンドルを入力としてに渡すことです。その後、無名関数内から呼び出すことができます。

%// The first input f is going to be an anonymous function 
myfun = @(f,x,n) f(f, x, n+1); 

%// Then use your anonymous function like this (note the first input) 
out = myfun(myfun, x, n); 

これは、ブランチングロジックがないため、明らかに無限に再帰します。あなたが分岐ロジックをシミュレートしたい場合は、この(hereから借りiif機能)を行うには、別の匿名関数を実装する必要があります:

%// Anonymous function to simulate if/elseif/else 
iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}(); 

%// Your anonymous function that is recursive AND has branching 
myfun = @(f,x,n)iif(n > 1, ...      % if n > 1 
        @()f(f, f(f, x, n-1), 1), ... % Recurse 
        true, ...      % else 
        @()expression(x));    % Execute expression() 

本当にsolid series of blog entriesのこの種の上に行くMathworks社のサイトにあります匿名関数を使用した関数型プログラミング

これは面白いエクササイズですが注意の

A言葉は、私は間違いなくあなたは、誰もが簡単にあなたのコードを理解したい場合は、これを使用してお勧めしません。標準関数をデバッグする方がはるかに明確で簡単です。次に、無名関数が本当に必要な場合は、その関数への呼び出しを無名関数でラップします。

myanonfunc = @(varargin)myfunc(varargin{:}); 

それとも機能

myfunchandle = @myfunc; 

+0

@sanchises分岐ロジックを実行するために私が知っている唯一の方法は第2の方法です。私は間違いなく、この種の関数型プログラミングをMATLABでやってしまうのをやめ、標準機能に固執します。ブログのエントリは間違いなく*面白い読み込みです。 – Suever

+0

はい、ありがたくありがとうございます。私が現在やっていることには使用しませんが、他のプロジェクトでも検討する価値があります。 – Sanchises

+0

@sanchises私はそれを更新しました。小さなバグがありましたが、元の関数の出力を複製する必要があります。 – Suever

関連する問題