func1
、、を持っているfunc2
としましょうfunc3
。それらの名前を定義した既知の引数でそれらを呼び出す方法はありますか?(またはそれらのポインター?ハンドラー?)
何かのようなもの:
toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
func1
、、を持っているfunc2
としましょうfunc3
。それらの名前を定義した既知の引数でそれらを呼び出す方法はありますか?(またはそれらのポインター?ハンドラー?)
何かのようなもの:
toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
これが関数ハンドルの目的です。
toBeRun = {@func1, @func2, @func3};
for ix = 1:length(toBeRun)
fnArguments = {1, 2, 3, 'four'};
fnTmp = toBeRun{ix};
fnTmp(fnArguments{:});
end
ここで行っていることについてもう少し説明します。
toBeRunは、関数ハンドルのセル配列であり、任意のリストです。Mファイルとして記述された関数の場合@
、関数ハンドルを作成するために必要なのはこれだけです。
関数を評価するには、セル配列から(fnTmp
この場合はに)削除する必要があります。これは、Matlabの構文上の制限です。を使用することもできますfneval
が、私は通常この方法で使用します。
通常の方法で、必要に応じて任意の引数を追加できます(例fnTmp(1,2,3,'four')
)。ただし、これだけの抽象化が必要な場合は、任意の数の入力引数を使用する必要がある場合もあります。fnArguments
セルは、これを実現するための非常に柔軟な方法です。
機能feval
:
for i = 1 : size(toBeRunned, 1)
feval(toBeRunned(i, :), argument);
end
それを達成する別の方法...
toBeRunned = { 'func1', 'func2', 'func3' };
% arguments to be provided to functions
VAR = { arg1, arg2, arg3, arg4 };
% preallocate space for results
results = cell(1, 3);
for i = 1 : length(toBeRunned)
% KEY part ...
toRun = eval( [ '@' boBeRunned{i} ] );
results{i} = toRun( VAR{:} );
end
コードの主要部分の説明:
[]
文字列を連結し、eval
文字列を Matlab コードとして評価します。ループの最初の繰り返しで、行は次のeval
ようになります。
toRun = @func1;