在调试器中评估具有多个返回值的函数

时间:2016-07-04 18:05:21

标签: matlab

假设我有一些函数foo(不是由我写的)返回多个值,如下所示:

function [one, two, three, four] = foo()
    one = 2;
    two = 4;
    three = 8;
    four = 16;
end

(注意:上面只是一个例子;一般来说,我无法控制函数foo。)

此外,假设我正处于MATLAB调试会话的中间。

如果我现在评估foo,则只显示它返回的第一个值:

K>> foo()
ans =
     2

如果我尝试使用赋值表达式捕获所有值,则会出现一个错误或另一个错误;例如:

K>> all_returned_values = foo()
Attempt to add "all_returned_values" to a static workspace.
 See Variables in Nested and Anonymous Functions.

K>> [v1 v2 v3 v4] = foo()
Attempt to add "v1" to a static workspace.
 See Variables in Nested and Anonymous Functions.

K>> {v1 v2 v3 v4} = foo()
 {v1 v2 v3 v4} = foo()
               ↑
Error: The expression to the left of the equals sign is not a valid target for an assignment.

有没有办法强制MATLAB返回依赖于赋值的函数的所有值?

注意:我正在寻找一种不需要以任何方式修改函数foo的解决方案。 (此功能可能不在我的控制之下;例如,它可能是内置的MATLAB功能。)

2 个答案:

答案 0 :(得分:4)

您始终可以将ans添加到静态工作区,以便您可以执行以下操作来获取所有输出值。

% Force ans to be a cell first
ans = cell();

% Assign all outputs to elements in ans
[ans{1:4}] = foo()

这会强制ans为单元格数组,其中前四个条目将使用foo的输出填充。 ans{1:4}创建一个以逗号分隔的列表,该列表将自动扩展为四个输出参数。

小心访问生成的单元格数组,因为会自动将其分配给ans

disp(ans{1})  % rather than ans{1} with no semicolon

% Alternately
celldisp(ans)

如果您希望它更灵活,可以使用nargout动态确定输出参数的数量。

[ans{1:nargout('foo')}] = foo();

答案 1 :(得分:2)

警告:以下适用于Matlab 2013b ,可能是早期版本。然而,它似乎不再适用于Matlab 2015b。因此,文档存在问题,而且不是最新的。

此问题在文档中有详细说明。以下是Variables in Nested and Anonymous Functions指南中的最佳做法建议:

  

操作类型:分配给MATLAB调试器中的变量

     

避免动态分配的最佳实践:创建一个全局变量以便临时用于调试,例如
  K>> global X;
  K>> X = myvalue;

请注意,它仅影响匿名函数,嵌套函数或包含嵌套函数的函数的作用域。在所有其他情况下,你可以做一个简单的任务。

因此,在您的情况下,以下内容可行:

K>> global v1 v2 v3 v4;
K>> [v1, v2, v3, v4] = foo();