2

問題:

結果を一時的に格納せずに、可変数の出力引数を返す関数呼び出しの結果にインデックスを付けたいと考えています。

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)。これにより、関数をよりうまくネストできます。

4

2 に答える 2

0

このようなことができますか?

独自のファイルで:

function idx=mymin(x)
  [~,idx] = min(x);

あなたのコードで:

v = arrayfun(@(s) s.val1(mymin(s.val2), x);

構文エラーがある可能性があります。これを書いているコンピューターに MATLAB がありません。ただし、アイデアはそこにあります。MATLAB をラップminして 2 番目の引数をキャプチャするだけです。これは、 の最小値の位置の論理インデックスですx

于 2012-05-25T18:58:58.093 に答える
0

次のように ind2sub() を取得して、可変数の引数を返すことができます。

x = zeros(2,2,2);
c = cell(ndims(x),1);
[c{:}] = ind2sub(size(x), 8);

c cell 配列には、3D インデックス c = {2;2;2} が含まれます。

[c{:}] = ind2sub(size(x), 2);

c = {2;1;1} を生成します。

これはあなたが探していたものですか?

于 2012-05-25T19:04:44.287 に答える