3

func1、、を持っているfunc2としましょうfunc3。それらの名前を定義した既知の引数でそれらを呼び出す方法はありますか?(またはそれらのポインター?ハンドラー?)

何かのようなもの:

toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
4

3 に答える 3

7

これが関数ハンドルの目的です。

toBeRun = {@func1, @func2, @func3};
for ix = 1:length(toBeRun)
    fnArguments = {1, 2, 3, 'four'};
    fnTmp = toBeRun{ix};
    fnTmp(fnArguments{:});
end

ここで行っていることについてもう少し説明します。

  1. toBeRunは、関数ハンドルのセル配列であり、任意のリストです。Mファイルとして記述された関数の場合@、関数ハンドルを作成するために必要なのはこれだけです。

  2. 関数を評価するには、セル配列から(fnTmpこの場合はに)削除する必要があります。これは、Matlabの構文上の制限です。を使用することもできますfnevalが、私は通常この方法で使用します。

  3. 通常の方法で、必要に応じて任意の引数を追加できます(例fnTmp(1,2,3,'four'))。ただし、これだけの抽象化が必要な場合は、任意の数の入力引数を使用する必要がある場合もあります。fnArgumentsセルは、これを実現するための非常に柔軟な方法です。

于 2012-11-12T20:15:47.880 に答える
3

機能feval

for i = 1 : size(toBeRunned, 1)
    feval(toBeRunned(i, :), argument);
end
于 2012-11-12T20:16:20.287 に答える
1

それを達成する別の方法...

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;
    
于 2013-01-15T03:02:19.677 に答える