有没有可能从函数中获得第n个返回值,而不必为之前的所有n-1
返回值创建伪变量?
比方说,我在MATLAB中有以下函数:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
现在假设,我只对第三个返回值感兴趣。这可以通过创建一个虚拟变量来实现:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
但我觉得这有点丑陋。我可能认为你可以做以下事情之一,但你不能:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
有没有什么优雅的方法可以做到这一点呢?
到目前为止,最好的解决方案是简单地使用variableThatIWillUse
作为一个虚拟变量。这使我不必创建一个污染工作空间(或需要清除)的真实虚拟变量。简而言之:解决方案是对每个返回值使用variableThatIWillUse
,直到感兴趣的返回值为止。之后的返回值可以简单地忽略:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
我仍然认为这是非常丑陋的代码。
发布于 2009-09-10 10:56:32
在MATLAB version7.9 (R2009b)中,你可以使用~,例如,
[~, ~, variableThatIWillUse] = myFunction();
请注意,,
不是可选的。只是输入[~ ~ var]
是行不通的,而且会抛出一个错误。
有关详细信息,请参阅release notes。
发布于 2009-04-14 15:32:00
如果您希望使用一种将变量留到位桶中的样式,那么一个合理的替代方案是
[ans, ans, variableThatIWillUse] = myfun(inputs);
ans
当然是MATLAB的默认垃圾变量,在会话过程中经常被覆盖。
虽然我确实喜欢MATLAB现在允许的新技巧,使用~
指定一个被忽略的返回变量,但这是一个向后兼容性的问题,因为旧版本的用户将无法使用您的代码。
我通常避免使用这样的新东西,直到发布了至少几个MATLAB版本,以确保很少有用户陷入困境。例如,即使是现在,我发现人们仍然在使用一个足够老的MATLAB版本,以至于他们不能使用匿名函数。
发布于 2009-08-28 10:52:12
我写了一个kth out函数:
function kth = kthout(k, ffnc, varargin)
%% kthout: take the kth varargout from a func call %FOLDUP
%
% kth = kthout(k, ffnc, varargin)
%
% input:
% k which varargout to get
% ffnc function to call;
% varargin passed to ffnc;
% output:
% kth the kth argout;
% global:
% nb:
% See also:
% todo:
% changelog:
%
%% %UNFOLD
[outargs{1:k}] = feval(ffnc, varargin{:});
kth = outargs{k};
end %function
然后,您可以调用
val_i_want = kthout(3, @myfunc, func_input_1, func_input_2); %etc
你也可以像这样包装这个函数:
func_i_want = @(varargin)(kthout(3, @myfunc,varargin{:})); % Assuming you want the third output.
之后,您可以使用
val_i_want = func_i_want(func_input_1, func_input_2);
请注意,使用这样的匿名函数会产生一些开销,而这不是我在会被调用数千次的代码中所做的事情。
https://stackoverflow.com/questions/747296
复制相似问题