2017-03-31 17 views
3

を設定せずに関数呼び出しからの出力数を強制、私は明示的に、私は[out1,out2,...,outn] = ...出力変数に任意の関数については

編集を期待していますどのように多くの出力を定義することによって返される変数を決定することができますよ出力の潜在的な#も

例の問題

次のコードが期待されているまさにん有用であろう(はい、それはと重複しています210)

[I,J] = ind2sub(size(myArray),IND) 
myArray(I,J) = 1; 

私が直接、関数の引数を渡すしようとすると、私は

myArray(ind2sub(size(myArray),IND)) = 1; 

をwannt結果を得ることはありません、私はmyArray(I,J) = 1;

質問を望んでいたとき、私は効果的myArray(I) = 1;を得る

出力変数が何個返されるかを指定するにはどうすればよいですか?明示的に私の出力引数を定義する?

eval()ファミリまたは一部のタイプキャスティングでは一部の機能が期待されますが、[],{},(:), etc.はそのトリックを行いますが、ドキュメントを見たり、動作させたりしていません。

答えて

5

中間変数なしmyArrayへのインデックスとして直接ind2subの出力を用いた即時の問題がmyArrayにインデックスを付ける場合ind2subの最初の出力は、subsindexによって要求されることです。最初の出力はlinear indexとして使用され、myArrayにインデックス付けされ、予期しない動作を引き起こす値が割り当てられます。

代わりにcell array to capture as many outputsを使用して、{}インデックス付けを使用してcomma-separated listを得ることができます。あなたが本当にドン」、あなたが示されたことの例では、言われていること

myArray(outputs{:}) = 1; 

:あなたはその後、別の場所inputs or subscriptsとして前方、その後にすべての値をすべての出力を含むこのセル配列を使用することができます

[outputs{1:ndims(myArray)}] = ind2sub(size(myArray), IND); 

あなたは線形インデックス​​を使用してmyArrayに直接索引付けすることができるので、これを行う必要はありません。 In fact, using the output of ind2sub will likely give you the incorrect assignment as every permutation of the subscripts will be used when assigning values rather than the element-wise pairing of subscripts。一般的に

myArray(IND) = 1; 

、あなたは出力の非可変数がある場合にすべての出力引数を要求するnargoutと一緒にこの技術を使用することができます。

[outputs{1:nargout('func')}] = func(inputs); 
+0

ありがとうございます。なぜ、可変出力を備えた組み込み関数のための明示的な出力定義が必要なのかを強調しました。私は、変数割り当てなしで明示的な出力定義を可能にするインライン・ソリューションを望んでいました(つまり、 'eval( 'foo(...)、 "nargout"、2 ') ')しかし、私は誰かが存在するという証拠は見ていない。 –

+0

@BrendanFrick私は混乱している。がある。それは '' {outputs {1:2}} =物 'です。 – Suever

+0

あなたはそのインラインで呼び出すことができますか? 'foo1([outputs {1:2}] = foo2(...))' –

関連する問題