匿名関数は非常に便利ですが、多くの場合、関数を機能させるためにループを使用する必要があります。例えば:
while val<tolerance
.....
end
関数を別のファイルに保存でき、コードをベクトル化して無名関数を機能させることもできますが、forループの代わりを見つけるのが非常に難しい場合もあります。
Matlabのドキュメントでは、それについて説明したり、不可能だと言ったりしていません。何か案は?
匿名関数は非常に便利ですが、多くの場合、関数を機能させるためにループを使用する必要があります。例えば:
while val<tolerance
.....
end
関数を別のファイルに保存でき、コードをベクトル化して無名関数を機能させることもできますが、forループの代わりを見つけるのが非常に難しい場合もあります。
Matlabのドキュメントでは、それについて説明したり、不可能だと言ったりしていません。何か案は?
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
たとえば、提供するval
wileには初期値がありval0
ます。さらに、それが各whileループでStuffDoneEachWhileLoop
変数を更新する方法を定義する関数であるとします。val
それで:
myFunc = @(n) loop(val0, ... % Initialize state
@(val) val < tolerance, ... % OP condition
@(val) StuffDoneEachWhileLoop(val)); %
上記のアイデアに対するさまざまな拡張が可能です。詳細については、TuckerMcClureの関数型プログラミングFEXの提出を参照してください。
単純な関数を使用するたびに新しい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
Matlabのドキュメントでは実際にそれについて説明していますが、説明はやや曖昧と見なされる場合があります。匿名関数のドキュメントから:
匿名関数は、標準関数と同じように、入力を受け入れて出力を返すことができます。ただし、それらに含めることができる実行可能ステートメントは1つだけです。
「実行可能ステートメント」で私が理解しているのは、実際には何らかの値を取得する式です。
私の知る限り、Matlabのループには値がないため、無名関数内で単一の実行可能ステートメントとして使用することはできません。さらに、単一のステートメントの制約は、ループを一部の計算に使用してから、無名関数内の2番目のステートメントで値を返すことができないことを意味します。