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