7

匿名関数は非常に便利ですが、多くの場合、関数を機能させるためにループを使用する必要があります。例えば:

while val<tolerance
     .....
end

関数を別のファイルに保存でき、コードをベクトル化して無名関数を機能させることもできますが、forループの代わりを見つけるのが非常に難しい場合もあります。

Matlabのドキュメントでは、それについて説明したり、不可能だと言ったりしていません。何か案は?

4

3 に答える 3

7

Mathworksファイル交換の関数型プログラミングコンストラクトはまさに必要なものです。これらの各関数は、無名関数内で使用するように設計されています。これらについては、Art of MATLABブログのLorenの3部構成のシリーズ、第1部、 第2部、および第3部で詳しく説明されています。

特にパート3では、関数としてのループの実装について説明します。完全を期すために、関数型プログラミングFEX送信からコードの一部を借用して、無名関数内でwhileループをmコードで使用する方法を示します。まず、loop関数を定義します。

   function x = loop(x, continueFcn, f)
   % Inputs:
   % x           - Initial state (can be cell array of arguments to f)
   % continueFcn - Continue function, returns true iff the loop should go on
   % f           - Function of the state (x) to run every iteration
       while ~continueFcn(x{:})
           x = f(x{:});
       end
   end

たとえば、提供するvalwileには初期値がありval0ます。さらに、それが各whileループでStuffDoneEachWhileLoop変数を更新する方法を定義する関数であるとします。valそれで:

myFunc = @(n) loop(val0, ...                    % Initialize state
                  @(val) val < tolerance, ...   % OP condition
                  @(val) StuffDoneEachWhileLoop(val));    %  

上記のアイデアに対するさまざまな拡張が可能です。詳細については、TuckerMcClureの関数型プログラミングFEXの提出を参照してください。

于 2013-02-07T03:10:30.790 に答える
1

単純な関数を使用するたびに新しいmファイルを作成する必要がある場合は、これが簡単な解決策になる可能性があります。

関数を作成していて、このスコープでのみ別の関数を使用したい場合は、新しいmファイルを作成する必要はありません。代わりに、ローカルで使用できる2番目の関数を定義するだけです。

たとえば、これを確認してください。

function [m,s] = stat2(x)
n = length(x);
m = avg(x,n);
s = sqrt(sum((x-m).^2/n));
end

function m = avg(x,n)
m = sum(x)/n;
end

http://www.mathworks.nl/help/matlab/ref/function.html;jsessionid=903a612c197e288e7cf631d7a434

于 2013-02-08T08:55:54.993 に答える
0

Matlabのドキュメントでは実際にそれについて説明していますが、説明はやや曖昧と見なされる場合があります。匿名関数のドキュメントから:

匿名関数は、標準関数と同じように、入力を受け入れて出力を返すことができます。ただし、それらに含めることができる実行可能ステートメントは1つだけです。

「実行可能ステートメント」で私が理解しているのは、実際には何らかの値を取得する式です。

私の知る限り、Matlabのループには値がないため、無名関数内で単一の実行可能ステートメントとして使用することはできません。さらに、単一のステートメントの制約は、ループを一部の計算に使用してから、無名関数内の2番目のステートメントで値を返すことができないことを意味します。

于 2013-02-06T23:36:27.920 に答える