11

foo次のように定義された関数があるとしましょう

   [a b] = foo(c ).

関数ハンドルを考えれば

 f = @(c)foo(c)

たとえばcellfun通話で使用する場合、私が取得するのは、次のように定義されfたものと同等の動作です。foo

  a = foo(c)

つまり、戻り値bは失われます。

したがって、そのようなfcellfun呼び出されると、出力セルにはasだけが含まれ、bs(現在気になっている)が失われます。視覚的に

    cellfun(f,input)

  [a(input{1})]           ?
  [a(input{2})]           ?
     ....            b gets killed along the way

質問: sだけfooキャッチする関数ハンドルを定義するにはどうすればよいbですか?fooつまり、のような定義に類似した動作を与える

  b = foo(c)

ie ^ 2、s を無駄aにします。

さらに、(効率的に)両方aユニークな呼び出しbをキャッチすることは可能ですか? cellfun

4

2 に答える 2

7

ドキュメントからcellfun:

[A1,...,Am] = cellfun(func,C1,...,Cn) は、関数ハンドル func で指定された関数を呼び出し、セル配列 C1,...,Cn から要素を渡します。ここで、n はセルの数です。関数 func への入力。出力配列 A1,...,Am (m は関数 func からの出力の数) には、関数呼び出しからの結合された出力が含まれます。

はい、cellfunマルチ出力関数を使用できます。この場合、単純に多数の出力を返します。2 番目のみを使用する場合は、 を使用~して最初のものを無視できます。同じことが無名関数の複数の出力にも当てはまります。複数の出力引数を指定すると、それらが返されます。簡単なコードを次に示します。

function test
    x{1} = 1;
    x{2} = 2;
    [~, B] = cellfun(@foo, x);
    f=@(c)foo(c);
    [A, B] = f(1);

    function [a b] = foo(x)
        a = x+1;
        b = x+2;
    end
end
于 2012-11-21T10:45:23.433 に答える
2

これは、複数の出力を持つ関数の代わりに、セル配列を関数の単一の出力として使用することで実行できます。

cell 配列を返す関数を定義します (または、元の複数出力関数を呼び出す補助関数を作成します)。

function F = foo2(x)
  [a,b,c] = foo(x);
  F = {a, b, c};
end

次に、関数を呼び出してセル配列からセルを 1 つだけ取得するハンドルを作成できます。

f = @(x) cell(foo2(x)){2} % This selects the second output
g = @(x) cell(foo2(x)){3} % This selects the third output

これは、あなたが求めていたものとほぼ同じです。n 番目の出力を返すハンドルを作成することもできます

f = @(x,n) cell(foo2(x)){n}
于 2015-09-15T16:20:27.567 に答える