複数の出力フォームを持つ関数を呼び出す匿名関数

私は、複数の出力を返す関数のバージョンを呼び出す無名関数を定義しようとしています。

たとえば、関数 find には次の2つの出力形式があります。

[row,col] = find(X);

そして

[ind] = find(X);

無名関数の中で最初のフォームを選択したいとします。

I have tried 1)

get_columns = @(x) x(2);

そして 2)

get_columns = @(x,y) y;

しかし私が電話するとき:

get_columns(find(x))

The first version of get_columns thinks I am calling find as [ind] = find(X) そして not as [row,col] = find(X);, while the second one complains with "Not enough input arguments".

匿名機能内部機能の特定出力フォームをトリガーする方法はありますか?

8
両方の出力を求めるヘルパー関数を作成することができます。 stackoverflow.com/questionsの無名関数による出力のスキップも参照してください。/3096281 /…
追加された 著者 Jonas,

2 答え

直接、いいえ。残念ながら、匿名関数を介してアクセスできない複数の機能があり、複数の出力引数にアクセスすることもその1つです。 (私がよく知るもう1つは、匿名関数の中で if ステートメントを定義できないということです。これはMatlab構文の限界と言えます。

しかし、非常に単純なヘルパー関数がこれを可能にすることができます。

function varargout = get_outputs(fn, ixsOutputs)
output_cell = cell(1,max(ixsOutputs));
[output_cell{:}] = (fn());
varargout = output_cell(ixsOutputs);

この関数は、関数ハンドルと出力インデックスの配列を取り、インデックス付きの出力を返します。

このファイルを作成し、それをあなたのパス上に置くと、次の関数を定義することで、 find 関数の2番目の出力にアクセスできます

find_2nd = @(x)get_outputs(@()find(x),2)

そして今では、1と等しい配列のインデックスを見つけることができます

>> find_2nd([4 3 2 1]==1)
ans =
    4

そして今、匿名関数の中から代替出力引数にアクセスすることができるはずです。

8
追加された

上記の get_outputs 関数は、簡単な匿名関数に広く役立ちます。非常に素晴らしい。

また、「if」をMATLABで使用できないというコメントに関しては、これは部分的にしか真実ではありません。同一の動作は匿名で簡単に実装できます。たとえば、匿名の場合は次のようになります。

anonymous_if = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();

つかいます:

out = anonymous_if(condition1, action1, condition2, action2, ...);

最初の真の条件に対応するアクションが実行されます。たとえば、これは 'hello'を出力します。

anonymous_if(false, @() disp('hi'), ... % if false, print 'hi'
             true,  @() disp('hello'))  % else if true, print 'hello'

確かに、一見するとちょっと複雑ですが、私はこのようなものを私の道に置いていますので、無名の関数で "if"を使うことができます。このように、もっと複雑な匿名関数を構築することができます。

3
追加された