Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
703 views
in Technique[技术] by (71.8m points)

matlab - How to directly pass multiple outputs of a function to another?

Let me elaborate with examples: We know how to easily combine functions with a single output:

a = sin(sqrt(8));

Now consider this example code containing two steps to calculate R, with X and Y as intermediate outputs.

[X, Y] = meshgrid(-2:2, -2:2);
[~, R] = cart2pol(X, Y);

In general is there a way to combine the two functions and get rid of intermediate outputs? For instance how can I write something similar to [~, R] = cart2pol(meshgrid(-2:2, -2:2)) that works same as the previous code?

Note: What makes my question different from this question is that in my case the outer function accepts multiple inputs. Therefore I cannot and do not want to combine the outputs of the first function into one cell array. I want them to be passed to the second function separately.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

To answer the question in the title: Using the following function, it is possible to redirect multiple outputs of a function to another:

function varargout = redirect(source, destination, n_output_source, which_redirect_from_source, varargin)
%(redirect(source, destination, n_output_source, which_redirect_from_source,....)
%redirect output of a function (source) to input of another function(destination)
% source: function pointer
% destination: function pointer
% n_output_source: number of outputs of source function (to select best overload function)
% which_redirect_from_source: indices of outputs to be redirected
% varargin arguments to source function
    output = cell(1, n_output_source);
    [output{:}] = source(varargin{:});
    varargout = cell(1, max(nargout,1));
    [varargout{:}] = destination(output{which_redirect_from_source});
end

And now we can apply it to the example:

[~,R] = redirect(@meshgrid,@cart2pol, 2, [1, 2], -2:2, -2:2)

Here, source function has 2 outputs and we want to redirect outputs 1 and 2 from source to destination. -2:2 is the input argument of the source function.


Other way to deal with the mentioned example: If you can use GNU Octave, with bsxfun and nthargout this is your solution:

R = bsxfun(@(a,b) nthargout(2, @cart2pol,a,b),(-2:2)',(-2:2))

in Matlab a possible solution is:

[~, R] = cart2pol(meshgrid(-2:2), transpose(meshgrid(-2:2)))

or

function R = cart2pol2(m)
    [~,R] = cart2pol(m,m')
end

cart2pol2(meshgrid(-2:2, -2:2))

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...