2011-02-06 106 views
33

有沒有一種方法可以在MATLAB中聲明全局變量?在MATLAB中聲明一個全局變量

請不要回應:

global x y z; 

因爲我還可以閱讀the help files

我聲明瞭一個全局變量,x,然後做了這樣的事情:

function[x] = test() 
    global x; 
    test1(); 
end 

當功能test1()被定義爲:

function test1() 
    x = 5; 
end 

當我運行test(),我的輸出是x = []。有沒有辦法讓它輸出x=5,或者我定義的x是在一個單獨的函數中嗎?在C中,這將是一個外部變量,我認爲把它作爲一個全局變量應該能夠實現這一點。

+5

+1能夠讀取幫助文件,至少直到它說:「但是,如果幾個函數,並可能基地工作區,*所有*聲明一個特定的名稱爲全球,他們都共享一個副本那個變量。' – Jonas 2011-02-06 13:30:52

回答

46

您需要在每個範圍(即函數/工作空間)中聲明xglobal variable,您希望它在其中共享。所以,你需要寫test1爲:

function test1() 
    global x; 
    x = 5; 
end 
+19

這是正確的。然而,對於「鋤頭我應該使用全局語言X」這個問題的答案几乎總是「不要」 – KitsuneYMG 2011-02-06 07:07:25

+4

@KitsuneYMG:同意。全局變量並不美觀,並且很難追蹤,但在極少數情況下可能是必要的罪惡。如果我更瞭解OP的具體情況(我認爲以上是一個簡化的例子),我可能會提出一個更好的方法。 – gnovice 2011-02-06 07:15:21

4

使用全局變量可以解決您的問題的方法參照您的評論對gnovice,但它不是一個常用。

首先確保您的.m文件功能而不是腳本腳本共享一個共同的工作空間,很容易不願意覆蓋你的變量。相比之下,函數有自己的範圍。

使用xUnit爲了生成可重複的單元測試您的功能。通過測試程序中涉及的每個函數,您將追蹤錯誤來源。進行單元測試後,可以輕鬆驗證進一步的代碼修改。

1

解決global混亂的一種可能的方法是將變量分配爲appdata。您可以使用功能setappdatagetappdata從MATLAB窗口分配和檢索appdata。只要MATLAB會話處於活動狀態,就會出現一個由0表示的窗口。

>> setappdata(0,'x',10) % 0 indicates the root MATLAB window 

現在變量x沒有任何腳本或函數可見,但可根據需要隨時隨地使用getappdata訪問。

function test 
    globalX = getappdata(0,'x'); 
    disp(globalX); 
end 

x = 
    10 

好消息是,你可以在任何有效的MATLAB對象分配到appdata,只是用名持謹慎態度,採用獨特的名字應用程序數據領域像ModelOptimizerOptions而不是一個通用的xy會有所幫助。這也適用於在MATLAB生產服務器上部署的已編譯的可執行文件和代碼。