2016-12-03 155 views
2

我的問題是,即使存在稱爲「畝」的局部變量,當代碼運行命令如何讓MATLAB忽略一個函數?

SQRT(畝)

Matlab的嘗試運行稱爲畝內部函數。

據我所知這不是一個正常的行爲。我如何讓Matlab使用局部變量來控制它的內部函數?

我打算用deploy工具編譯這個代碼,因此修改matlab的內部函數文件是不合適的。在編譯版本中會出現問題。

讓我給有關該問題的更詳細,

的main.m文件調用function_a.m功能。 Function_a函數運行另一個腳本,名稱爲常量。 Constants.m文件不是一個函數,而是一個腳本,它只保留一些變量,因此當它加載它時,會用這些變量填充工作區。它的格式是,

const1=3; const2=5; mu=2; 

在function_a運行constant.m之後,它會嘗試使用mu值。這是當matlab從內部mu函數中發出錯誤時。這意味着Matlab不使用由contants.m創建的本地mu變量。

我用調試器在運行constant.m之後停止代碼,但在命令中使用mu之前。穆實際上應該是在工作空間。在調試模式下,如果我使用sqrt(mu)命令,它應該可以正常工作。但是當我讓繼續運行時,當同樣的命令寫入函數文件時,Matlab會給出顯示它正在嘗試使用內部函數的錯誤。

我該如何解決這個問題?

回答

4

首先,沒有名爲mu的內部函數,所以我不知道這裏有什麼混亂。

的問題可能發生,因爲你已經使用mu作爲一個函數,然後內Constants腳本,你把它作爲一個變量和MATLAB的靜態代碼分析會很困惑,所以它去與它的第一次使用的功能。這是你遇到的相同問題if you called load and tried to load a variable with the name of a function into the current workspace

但一般來說,爲了避免這樣的問題,您應該避免使用像Constants.m這樣的腳本來填充調用函數的工作區。這是因爲如果調用函數的工作空間包含具有相同名稱的函數或變量,那麼最終會產生歧義。更好的方法是使Constants功能,並使其返回一個struct然後可以用於訪問常數變量

function S = Constants 
    S.const1 = 3; 
    S.const2 = 5; 
    S.mu = 2; 
end 

然後從調用函數

constants = Constants(); 

% Use the constants 
value = constants.const1 + constants.mu; 

% Or assign them to "safe" variables that are specific to this calling function 
my_mu = constants.mu; 

以這種方式中, mu from Constants.m並不總是必須被調用mu,這導致更強大和可重用的代碼。

+0

不應該是'函數S =常量'嗎? – hbaderts

+0

@hbaderts是的,謝謝 – Suever