2012-07-12 44 views
14

ベクトルを関数呼び出しにスプライスしたいが、これを行う方法が見つからない。出来ますか?Matlab ---関数呼び出しの引数にベクトルをスプライス

私が意味するところでは、nのベクトルxと、nという引数をとる関数fがあります。私はf(x)またはf(splice(x))のようなものを呼び出すことによってf(x(1), x(2), ..., x(n))に電話したいと思っています。ベクトルの代わりにxがセル配列だった場合は、f(x{:})を呼び出すと目的の結果が得られます。 xがベクターである場合に相当するものがあることは妥当と思われます。

私が紛失しているオペレータや機能がほしいと思っています。 y = num2cell(x)のあとにf(y{:})と呼ぶことができますが、これは私が探しているものではありません。すでにコメントで

tmp = num2cell(x) 
f(tmp{:}) 

を述べ

+0

'x(:)'は動作しませんか?あるいは、列ベクトルの場合は 'x(:) 'を使います。 – Thor

+0

'num2cell'ルートはあなたが探しているものです。 – Jonas

+0

@Jonas Fairは、その解決策が簡単であるという点で十分です。しかし、私は一時的な変数を指定しなければならないというのはちょっとばかげていると思います(したがって、変数の内容を余分な時間にコピーする必要があります)。なぜこの機能はセル配列には存在しますが、おそらくより一般的な数値配列(つまり、「matlab」の「mat」)には存在しませんか?とにかく、それが私が求めていた理由です:それはちょうどサポートされている可能性が高い機能のように思えましたが、何とかしていなかったのです。 – zroth

答えて

7

は、移動するための方法です。

A機能splicef(splice(x))はあなたが望むことをするので、やりません。 入力を複数の出力に分割することができたとしても、fは最初の引数のみを取ります(出力を要求せずにコマンドラインで関数を呼び出す場合と同様です)。

この場合でも、subsrefは機能しません。 subsref(num2cell([1 2]),struct('type','{}','subs',{{':'}}))は、splice関数と同じことを行います。つまり、複数の出力が明示的に要求されていない限り、出力を1つだけ返します。

+0

'f'が複数の引数を取る場合、この関数は' f(splice(x)) 'を呼び出すことはできません。理由は、matlabは要求された出力引数の数を1に解釈するからです。これは関数定義に 'disp(nargout);'を明示することで明示的に見ることができます。 – zroth

+0

@zroth:テストに感謝します。 – Jonas

+0

ああ、そうです。私は 'subsref'を明示的に呼び出すことができることを完全に忘れていました。私はあなたの提案された 'subsref'呼び出しが' y = num2cell([1 2]) 'に対して' y {:} 'を呼び出すのと同じでない理由を理解していません。しかし、あなたが言ったように、それはちょうどうまくいきません。試してくれてありがとう。 – zroth

関連する問題