Matlab 如何将一个函数的多个输出直接传递给另一个函数?

Matlab 如何将一个函数的多个输出直接传递给另一个函数?,matlab,function,arguments,octave,Matlab,Function,Arguments,Octave,让我用示例来详细说明:我们知道如何轻松地将函数与单个输出结合起来: a = sin(sqrt(8)); 现在考虑这个示例代码,包含两个步骤来计算 r>代码>,以 x < /代码>和 y>代码>作为中间输出。 [X, Y] = meshgrid(-2:2, -2:2); [~, R] = cart2pol(X, Y); 总的来说有没有办法将这两种功能结合起来,摆脱中间输出?例如,我如何编写类似于[~,R]=cart2pol(meshgrid(-2:2,-2:2))的代码,其工作原理与前面的代码

让我用示例来详细说明:我们知道如何轻松地将函数与单个输出结合起来:

a = sin(sqrt(8));

现在考虑这个示例代码,包含两个步骤来计算<代码> r>代码>,以<代码> x < /代码>和<代码> y>代码>作为中间输出。

[X, Y] = meshgrid(-2:2, -2:2);
[~, R] = cart2pol(X, Y);
总的来说有没有办法将这两种功能结合起来,摆脱中间输出?例如,我如何编写类似于
[~,R]=cart2pol(meshgrid(-2:2,-2:2))
的代码,其工作原理与前面的代码相同


注意:我的问题与之不同的是,在我的例子中,外部函数接受多个输入。因此,我不能也不想将第一个函数的输出合并到一个单元格数组中。我希望将它们分别传递给第二个函数。

要回答标题中的问题:使用以下函数,可以将一个函数的多个输出重定向到另一个函数:

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
现在我们可以将其应用到示例中:

[~,R] = redirect(@meshgrid,@cart2pol, 2, [1, 2], -2:2, -2:2)
这里,源函数有两个输出,我们希望将输出1和2从源重定向到目标-2:2是源函数的输入参数


处理上述示例的其他方法:如果您可以使用GNU倍频程,使用
bsxfun
nthargout
这是您的解决方案:

R = bsxfun(@(a,b) nthargout(2, @cart2pol,a,b),(-2:2)',(-2:2))
在Matlab中,一种可能的解决方案是:

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


如果你只想为这个例子给出一个具体的答案,
cart2pol
函数只需要2个输入,通过给它meshgrid
[xy]
的输出,你就给了它一个矩阵作为输入。实际上我只想举一个例子来说明
cart2pol
。我将修改我的帖子。解释了@EBH差异的可能重复。虽然这个解决方案可能有效,但看起来并没有太好。“两行方法至少能让未来的用户清楚地知道你在做什么。”我同意。Matlab语言的流行很大程度上归功于它的表达能力。然而,这个答案是作为一个解决办法提供的
function R = cart2pol2(m)
    [~,R] = cart2pol(m,m')
end

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