Passing multiple outputs inside a function

11 ビュー (過去 30 日間)
Victor
Victor 2011 年 9 月 8 日
I have been trying to program a function that will evaluate another function:
function [result]=evaluate(second_function,x,y,z)
.
.
.
the problem arises when the second_function has multiple outputs:
function [a,b,c]=second_function(x,yz)
I am clueless as to how to pass each output to the calling function ("evaluate"), so that it can use them for further purposes. I am aware of the nargout function but then I am lost as to how to dynamically assign each output to, say, a vector containing each output in a different row:
function [result]=evaluate(second_function,x,y,z)
v(:)=second_function(x,y,z);
Of course, I could program second_function in a way that the multiple outputs would be compressed in a vector:
function [a]=second_function(x,y,z)
a(1)=...;
a(2)=...;
a(3)=...;
But that adds further complications to the rest of my code.
I have to clarify that second_function is different each time (user defined) and I want the program to dynamically evaluate it.

採用された回答

Walter Roberson
Walter Roberson 2011 年 9 月 8 日
You cannot do this unless you are willing to restrict the user functions to not using varargout .
If you are willing to restrict to not using varargout, then you can use
clear out
[out{1:nargout(second_function)}] = second_function(x,y,z);
and then pass out{:} down the line.
However, if the user is allowed to use varargout, then they could easily write a function that returns as many outputs as there were output slots provided. Such a function already exists, by the way: deal() will return as many outputs as you give output locations.
  1 件のコメント
Victor
Victor 2011 年 9 月 9 日
Spot on!
[out{1:nargout(second_function)}] = second_function(x,y,z)
it really worked!
I would like to avoid varargout since I believe that it is easier for the user, who I assume doesn't necessarily know how it works. Also, I believe that having several separate outputs makes my work easier as I can analyze the input function with nargin and nargout (nargout yields -nargout when used with a varargout function and is "blind" to how many variables are nested in varargout: I need to have a full understanding of the target, user-defined, function).
I digress, thanks for the help!

サインインしてコメントする。

その他の回答 (1 件)

Paulo Silva
Paulo Silva 2011 年 9 月 8 日
doc varargin
  2 件のコメント
Oleg Komarov
Oleg Komarov 2011 年 9 月 8 日
You can use varargout and store several outputs in a cell array and pass it to the second functions as out{:}, i.e. "unpacking" the content of the cell array.

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by