2016-07-04 16 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不工作。顯然文檔不是最新的。在我的回答中明確表示。 –