44

私はこのようなことをしたいと思います:

>> foo = @() functionCall1() functionCall2()

だから私が言ったとき:

>> foo()

実行functionCall1()してから実行しfunctionCall2()ます。( C , 演算子のようなものが必要だと感じています)

編集:

functionCall1functionCall2必ずしも値を返す関数ではありません。

4

5 に答える 5

47

関数を m ファイルに保存せずにコマンド ラインからすべてを実行しようとするのは、複雑で厄介な作業になる可能性がありますが、私が思いついた 1 つの方法を次に示します...

まず、無名関数を作成し、そのハンドルcell 配列に入れます。

fcn1 = @() ...;
fcn2 = @() ...;
fcn3 = @() ...;
fcnArray = {fcn1 fcn2 fcn3};

...または、(m ファイルのように) 関数が既に定義されている場合は、次のように関数ハンドルを cell 配列に配置します。

fcnArray = {@fcn1 @fcn2 @fcn3};

cellfun次に、組み込み関数とを使用して、配列内の各関数を呼び出す新しい無名関数を作成できますfeval

foo = @() cellfun(@feval,fcnArray);

変な見た目ですが、機能します。

編集:関数fcnArrayを入力引数で呼び出す必要がある場合は、最初に、配列内のすべての関数が同じ数の入力を必要とすることを確認する必要があります。その場合、次の例は、関数の配列をそれぞれ 1 つの入力引数で呼び出す方法を示しています。

foo = @(x) cellfun(@feval,fcnArray,x);
inArgs = {1 'a' [1 2 3]};
foo(inArgs);  %# Passes 1 to fcn1, 'a' to fcn2, and [1 2 3] to fcn3


警告の言葉:のドキュメントにcellfunは、出力要素が計算される順序が指定されておらず、依存すべきではないと記載されています。これは、またはのfcn1前に評価される保証がないことを意味します。順序が重要な場合、上記の解決策は使用しないでください。fcn2fcn3

于 2009-02-17T21:49:09.340 に答える
7

これは、実行順序を保証するメソッドであり、(最後に変更が記載されています) さまざまな引数をさまざまな関数に渡すことができます。

call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));

重要なのはcall1、最初の引数を呼び出し、2 番目の引数を無視することです。call12最初の引数を呼び出してから 2 番目の引数を呼び出し、2 番目の引数から値を返します。関数は引数の前に評価できないため、機能します。例を作成するには、次のように記述します。

foo = @() call12(functionCall1, functionCall2);

テストコード

使用したテストコードは次のとおりです。

>> print1=@()fprintf('1\n');
>> print2=@()fprintf('2\n');
>> call12(print1,print2)
1
2

より多くの関数を呼び出す

3 つの関数を呼び出すには、次のように記述できます。

call1(print3, call1(print2, call1(print1,print2)));

4つの機能:

call1(print4, call1(print3, call1(print2, call1(print1,print2))));

より多くの関数については、ネスト パターンを続けます。

引数を渡す

引数を渡す必要がある場合は、call1引数を取るバージョンの を作成してから、 に明らかな変更を加えることができcall12ます。

call1arg1 = @(a,arg_a,b) a(arg_a);
call12arg1 = @(a, arg_a, b, arg_b) call1arg1(b, arg_b, call1arg1(a, arg_a, b))

複数の引数を取り、必要に応じてそれらを組み合わせて一致させるバージョンの call1 を作成することもできます。

于 2012-10-17T18:55:24.673 に答える
3

コンマ区切りリストの作成に使用されるcurly関数を使用して可能です。

curly = @(x, varargin) x{varargin{:}};
f=@(x)curly({exp(x),log(x)})
[a,b]=f(2)
于 2016-01-14T18:00:57.707 に答える
1

そして何かfunctionCall1()functionCall2()返し、それらの何かを連結できる場合、これを行うことができます:

>> foo = @() [functionCall1(), functionCall2()]

また

>> foo = @() [functionCall1(); functionCall2()]

これの副作用はfoo()、何でも連結してfunctionCall1()返すfunctionCall2()ことです。

functionCall1()andの実行順序functionCall2()が保証されているかどうかはわかりません。

于 2009-02-18T12:30:29.690 に答える