2016-07-11 321 views
0

我在Matlab上編寫了一些程序。我在.m文件中做。現在它有300多個代碼串,所以閱讀起來不太舒服。我的想法是像在C++中一樣使用它:我想在這個文件的末尾創建本地函數,並將代碼放入其中。這將很容易閱讀,它會包含一些邏輯部分。代碼組織Matlab

但是我面臨的事實是本地函數只能在其他函數體中創建!所以我不能創造這樣的:

x = 1; 
y = 2; 
z = myLocalFnc(x,y); 

function res = myLocalFnc (a,b) 
res = a.*b; 
end 

此產生錯誤:

Function definitions are not permitted in this context.

我可以包括整個代碼轉換成一個功能做到這一點:

function myBigFcn 
x = 1; 
y = 2; 
z = myLocalFnc(x,y); 
end 

function res = myLocalFnc (a,b) 
res = a.*b; 
end 

但現在所有的變量變成本地變量,並且它不返回工作區。 修改此功能的輸入/輸出任何時候我創建一些變量 - 我不認爲我走正確的方式... Here描述了這種方法的優點和缺點。

我知道我可以在附加的.m文件中創建函數,保存它並在我的腳本中使用 - 好吧,但其中很多是單操作的,我不想創建這麼多的新文件。

我的問題是任何其他的代碼組織方法?

+0

@excaza我想我*唯一的原因是因爲我們現在在2016b有一個* actual *解決方案,應該注意。 – Suever

+0

@Suever所以添加它作爲答案的愚蠢。沒有理由在第一時間回答這個問題...... – excaza

回答

1

一個選項,如果你不介意保存文件本地,就是要調整你的代碼轉換成多種功能(全部在同一個文件),並通過必要的變量輸出。然後你有一個簡短的腳本調用這個函數並創建必要的變量。

例如,假設你的腳本看起來像這樣

numPoints = 5; 
a = randn(numPoints); 
b = sin(a); 
c = a + b; 

你可以重組它看起來像

function data = main() 
    data.numPoints = 5; 
    data.a = getA(data.numPoints); 
    data.b = getB(data.a); 
    data.c = getC(data.a, data.b); 

function a = getA(numPoints) 
    a = randn(numPoints); 

function b = getB(a) 
    b = sin(a); 

function c = getC(a, b) 
    c = a + b; 

,並創建一個腳本文件,它看起來像

data = main(); 

你然後有一個叫做data的結構,它包含了所有的變量。如果你真的希望它們被包含在單獨的變量中(即不在結構中),那麼有幾種方法可以實現它。一個是手動解壓它們,

a = data.a; 
b = data.b; 
c = data.c; 

clear data; 

另一個是拯救結構,然後將其重新(這有保存您用於這個有趣的功能的工作區的副本的優勢,以供以後分析)。

save('workspace.mat', '-struct', 'data'); 
load('workspace.mat'); 
+0

我喜歡使用腳本將所有其他代碼放入另一個函數的想法。謝謝 –

2

如果你真的想讓你的主要東西成爲一個腳本(我不建議這樣做),你可以將所有其他功能放在單獨的.m文件中,並在腳本中調用它們。

正如您已經提到的,另一個選項是將您的「主」部分的全部內容放入代碼頂部的函數中。如果您稍後需要訪問它們,您可以通過輸出參數返回所有必需的值或將它們保存爲.mat文件。

作爲便箋,the ability to put local functions within a script (what you're trying to do) is present in R2016b which will be released later this Fall

更新

如果你想要一個簡單的方法,你的代碼轉換爲一個功能。您可以輕鬆地將所有變量自動保存到函數結尾的結構中,並返回該結構。

function output = my_script_that_is_now_a_function(inputs) 

    % Do stuff 

    % Now save all variables in a struct and return it 
    tmpfile = tempname; 
    save(tmpfile); 
    output = load(tmpfile); 
    delete(tmpfile); 
end 
+0

感謝您的快速響應!你可以添加信息爲什麼你建議避免使用腳本?還有什麼更好使用 - .m文件功能? –

+1

@Mikhail_Sam依賴腳本將所有變量保存到全局工作空間通常是一個糟糕的主意。如果你保存一個變量'M'並且你已經有一個變量'M',那該怎麼辦?你應該使用函數並顯式返回你需要的變量,並允許用戶指定在哪裏存儲這些變量 – Suever

+0

我明白了。看起來像R2016b是我想要的。 我也理解使用腳本的缺點,但我喜歡收縮我的代碼的階段 - 因爲我通常檢查很多臨時變量,所以將它們全部添加到函數輸出 - 這是很多例程... –