問題:
結果を一時的に格納せずに、可変数の出力引数を返す関数呼び出しの結果にインデックスを付けたいと考えています。
getel = @(x,i) x(i); #% simple anonymous function to index into a vector
x = zeros(2,2,2);
row = getel(ind2sub(size(x), 8), 1) #% desired: 2 (row 2)
#% actual: 8 (linear index)-because ind2sub is returning 1 value only
[row col dep]=ind2sub(size(x),8) #% row=2, ind2sub returning 3 values
使用例:
x(1).val1 = [1 2 3];
x(1).val2 = [2 1 2];
x(2).val1 = [2 1 2];
x(2).val2 = [1 0 0];
#% The normal way I would do this, with a temporary variable
[~,ind] = min(x(1).val2); #% ind=2
v(1) = x(1).val1(ind);
[~,ind] = min(x(2).val2); #% ind=2
v(2) = x(2).val1(ind);
#% I'd like to be able to do this with arrayfun:
v = arrayfun(@(s) s.val1(min(s.val2), x);
-------^ returns value of minimum, not index
上記の arrayfun は機能しません。呼び出された min の形式は、1 つの出力 (最小値) を返します。正しく機能させるには、次の仮想関数呼び出しが 1 つのオプションになります。
v = arrayfun(@(s) s.val1(getoutputnum(2, 2, @min, s.val2)), x);
hypothetical function -----------^ ^ ^ ^-func ^--func args
which form (nargout) of func ---| |- which arg to return
上記のシナリオでは、使用できることを認識しています
s.val1(find(s.val2==min(s.val2),1,'first'))
または他のトリックですが、すべての場合に可能というわけではありません。
の場合ind2sub
、特定の次元 (列など) へのインデックスを知りたい場合があります。ただし、関数の 1 出力形式は線形インデックス値のみを返します。n 次元形式を呼び出す必要があります。次元 1 の値が重要です。
注: 関数ファイルを作成する~
と、use と[out] = func(in)
form が簡単になることがわかります。ただし、スクリプトを作成する場合やコマンド ラインでのみ実行する場合は、匿名関数内ですべて実行できると便利です。また、この問題を回避する方法が間違いなく他にもあることも認識しています。構文を使用せずに、呼び出す関数の形式と、おそらく返される出力番号を指定できるかどうかを知りたいだけですout=func(in)
。これにより、関数をよりうまくネストできます。