如何将一个函数的多个输出直接传递给另一个?
How to directly pass multiple outputs of a function to another?
让我用 示例详细说明: 我们知道如何轻松地将函数与单个输出组合:
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)
此处,源函数有 2 个输出,我们希望将输出 1 和 2 从源重定向到目标。 -2:2 是源函数的输入参数。
处理上述示例的其他方法: 如果您可以使用 GNU Octave,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)))
或
function R = cart2pol2(m)
[~,R] = cart2pol(m,m')
end
cart2pol2(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)
此处,源函数有 2 个输出,我们希望将输出 1 和 2 从源重定向到目标。 -2:2 是源函数的输入参数。
处理上述示例的其他方法: 如果您可以使用 GNU Octave,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)))
或
function R = cart2pol2(m)
[~,R] = cart2pol(m,m')
end
cart2pol2(meshgrid(-2:2, -2:2))