2016-07-04 60 views
4

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

回答

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(); 
+3

更好地使用'ANS =细胞(1,4); [答案{:}] = FOO()'。无论先前分配给ans的值如何,它都可以工作。 – Daniel

+0

@Daniel好点。添加。 – Suever

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(); 
+0

你真的尝试过吗?当我尝试在MATLAB调试器中提出的代码时,我遇到了我在文章中提到的一个错误。 – kjo

+1

我有。它在2013b工作得很好,但在2015b不工作。显然文档不是最新的。在我的回答中明确表示。 –