【问题标题】:Evaluating functions with multiple return values in the debugger在调试器中评估具有多个返回值的函数
【发布时间】:2016-07-05 02:57:41
【问题描述】:

假设我有一些函数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 函数。)

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您始终可以将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();
    

    【讨论】:

    • 更好地使用ans=cell(1,4);[ans{:}] = foo()。无论先前分配给 ans 的值如何,它都可以工作。
    【解决方案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();
    

    【讨论】:

    • 你真的试过这个吗?当我在 MATLAB 调试器中尝试您提出的代码时,我遇到了我在帖子中提到的错误之一。
    • 我有。它在 2013b 中运行良好,但在 2015b 中不起作用。显然文档不是最新的。在我的回答中说清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多