首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何优雅地忽略MATLAB函数的某些返回值

如何优雅地忽略MATLAB函数的某些返回值
EN

Stack Overflow用户
提问于 2009-04-14 20:28:49
回答 6查看 55.7K关注 0票数 122

有没有可能从函数中获得第n个返回值,而不必为之前的所有n-1返回值创建伪变量?

比方说,我在MATLAB中有以下函数:

代码语言:javascript
复制
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;

现在假设,我只对第三个返回值感兴趣。这可以通过创建一个虚拟变量来实现:

代码语言:javascript
复制
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;

但我觉得这有点丑陋。我可能认为你可以做以下事情之一,但你不能:

[_, _, variableThatIWillUse, _] = func;

[, , variableThatIWillUse, ] = func;

variableThatIWillUse = func(3);

variableThatIWillUse = func()(3);

有没有什么优雅的方法可以做到这一点呢?

到目前为止,最好的解决方案是简单地使用variableThatIWillUse作为一个虚拟变量。这使我不必创建一个污染工作空间(或需要清除)的真实虚拟变量。简而言之:解决方案是对每个返回值使用variableThatIWillUse,直到感兴趣的返回值为止。之后的返回值可以简单地忽略:

代码语言:javascript
复制
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;

我仍然认为这是非常丑陋的代码。

EN

回答 6

Stack Overflow用户

发布于 2009-09-10 10:56:32

在MATLAB version7.9 (R2009b)中,你可以使用~,例如,

代码语言:javascript
复制
[~, ~, variableThatIWillUse] = myFunction();

请注意,,不是可选的。只是输入[~ ~ var]是行不通的,而且会抛出一个错误。

有关详细信息,请参阅release notes

票数 232
EN

Stack Overflow用户

发布于 2009-04-14 15:32:00

如果您希望使用一种将变量留到位桶中的样式,那么一个合理的替代方案是

代码语言:javascript
复制
[ans, ans, variableThatIWillUse] = myfun(inputs);

ans当然是MATLAB的默认垃圾变量,在会话过程中经常被覆盖。

虽然我确实喜欢MATLAB现在允许的新技巧,使用~指定一个被忽略的返回变量,但这是一个向后兼容性的问题,因为旧版本的用户将无法使用您的代码。

我通常避免使用这样的新东西,直到发布了至少几个MATLAB版本,以确保很少有用户陷入困境。例如,即使是现在,我发现人们仍然在使用一个足够老的MATLAB版本,以至于他们不能使用匿名函数。

票数 38
EN

Stack Overflow用户

发布于 2009-08-28 10:52:12

我写了一个kth out函数:

代码语言:javascript
复制
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

然后,您可以调用

代码语言:javascript
复制
val_i_want  = kthout(3, @myfunc, func_input_1, func_input_2); %etc

你也可以像这样包装这个函数:

代码语言:javascript
复制
func_i_want = @(varargin)(kthout(3, @myfunc,varargin{:}));  % Assuming you want the third output.

之后,您可以使用

代码语言:javascript
复制
val_i_want = func_i_want(func_input_1, func_input_2);

请注意,使用这样的匿名函数会产生一些开销,而这不是我在会被调用数千次的代码中所做的事情。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/747296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档