2012-01-23 64 views

回答

2

其他答案是所有可能的解決方案,但可能比您可能要尋找的更復雜。我認爲yuk's answer的第一部分解決了您遇到的實際問題,但我認爲它值得更詳細的解釋...

如果您有一個函數具有output arguments,您需要實際捕獲變量中的那些參數你調用這個函數。例如,如果您在命令窗口中鍵入:

[x, y, m] = testinit; 

然後,您將有三個輸出值供您使用。什麼你可能做打字這樣的:

testinit; 

顯示值(因爲你並沒有結束,在函數每一行有semicolon to suppress displaying them),但它不會他們變量在命令窗口中供您稍後使用。

這是如何variables存儲在MATLAB,由documentation on variable scope如下描述的結果:

MATLAB stores variables in a part of memory called a workspace. The base workspace holds variables created during your interactive MATLAB session and also any variables created by running scripts. Variables created at the MATLAB command prompt can also be used by scripts without having to declare them as global.

Functions do not use the base workspace. Every function has its own function workspace. Each function workspace is kept separate from the base workspace and all other workspaces to protect the integrity of the data used by that function. Even subfunctions that are defined in the same file have a separate function workspace.

所以,如果你想分享功能之間的變量,最簡單的方法是將它們來回傳遞通過他們的input and output argument lists

還應當指出的是,你給的函數的輸出參數列表變量的名稱不必相匹配的變量,你把這些輸出值的名稱,例如,鑑於這一功能:

function [a, b, c] = testinit 
    a = 4; 
    b = 3; 
    c = 2; 

您可以撥打這個電話在命令窗口中:

[x, y, m] = testinit; 

,你會得到x = 4y = 3m = 2

3

還有的assignin功能(evalin有關)。還有global

4

只是添加到上面的答案,你得到這個的原因是因爲MatLab函數中的變量是局部變量,它們不會傳遞到工作區,除非您使用上述答案中的函數之一。你可以閱讀更多關於全局和局部變量here

P.S如果你寫了一個不是函數的m文件,那麼這些變量是全局變量。

1

變量對函數來說是局部的,所以你不能從命令行訪問它們。正如@BenVoigt所說,你可以使用asignin,但它很髒,我不認爲這是你真正想做的。

我勸你不要去調試模式

添加break pointkeyboard給你的函數那樣:

function [x, y, m] = testinit 

x=4 
y=3 
m=2 

keyboard 

執行的功能後,命令行會留在功能的環境。 將通常的>>殺滅替換爲K>>。那時你可以訪問你所有的局部變量。

要退出調試模式類型dbquit,或按shift+F5

2

如果您在你應該得到的變量控制檯[x, y, m] = testinit。輸出變量可以有任何允許的名稱,不需要x,y和m。

此外,您應該在函數中的每個變量賦值之後放置;以避免它們輸出到控制檯。您可以在調用該函數時控制控制檯輸出。

如果您只是想輸入testinit來初始化新變量,請使用assignin,如@ BenVoigt的答案。

assignin('base','x',4) 

但是,這是危險的,因爲某些變量可能已經存在於調用環境中並且會被覆蓋。你能避免它加入EXIST測試(內EVALIN):

function testinit 

if ~evalin('base','exist(''x'',''var'')') 
    assignin('base','x',4) 
end 
if ~evalin('base','exist(''y'',''var'')') 
    assignin('base','y',3) 
end 
if ~evalin('base','exist(''m'',''var'')') 
    assignin('base','m',2) 
end 

您還可以使用,而不是「基地」'調用者,如果你打算從另一個調用函數的函數。

+0

+1提到最簡單和最可能的問題來源:需要將輸出參​​數分配給變量。 – gnovice

相關問題