2017-04-20 206 views
1

首先,我已經看過這個優秀的article了。 我有一個MATLAB腳本,名爲sdp。我有另一個MATLAB腳本track。我在sdp之後運行track,因爲track使用了一些來自sdp的輸出。爲了運行軌跡,我需要多次調用一個名爲action的函數。我把action定義爲一個單獨的MATLAB文件中的函數。這個action的每個調用都有一些輸入,比如x1,x2,x3,但是x2,x3只是「數據」,它永遠不會改變。它們在sdp中相同,在track中相同,並且在action中保持不變。在這裏,x2,x3是巨大的矩陣。其中有很多(想想x2,x3,...x10全局變量的替代方案:MATLAB中的持久變量和嵌套函數

跛腳的方式是將x2,x3定義爲sdp中的全局然後跟蹤,因此我可以調用只有x1的動作。但這會讓我的表現難以置信地變慢。我怎樣才能通過x1來一次又一次的行動,使它記得x2,x3是什麼?每個通話都非常快,如果我以內聯方式進行通話,則速度非常快。

也許我可以使用一些持久變量。但我不明白它們是否適用於我的例子。我不知道如何正確使用它們。

回答

0

看看object oriented programming in Matlab。創建一個action對象,您可以將成員變量x2 ...分配給sdp的結果。然後你可以調用action的方法,只有x1。將對象看作一個帶有狀態的函數,其中狀態信息是sdp的恆定結果。

另一種方法是使用功能性方法,通過action將其追蹤爲function handle,其中它可以在track的變量上運行。

+0

面向對象的編程方法會更快嗎?我不確定。你熟悉持久變量還是嵌套這些函數,或許這是相關的? – bissi

0

在MATLAB中傳遞大型矩陣是有效的。在語義上它使用按值調用,但是它被實現爲調用引用直到被修改。將所有不變參數包裹在參數結構中並傳遞給它。

params.x2 = 1; 
params.x3 = [17 39]; 
params.minimum_velocity = 19; 

action('advance', params); 

您已經發現全局變量執行不好。不要擔心在某處隱藏變量的語法糖......清楚地看到輸入來自哪裏,並且性能會很好。

這種方法還可以很容易地添加新的數據成員,甚至是輔助元數據,例如運行描述,執行時間等。結構可以組合成數組來描述具有不同參數的多次運行。

+0

參數結構只是一種美學結構,還是它對性能也有積極影響?這不僅僅是傳遞x2和x3,而是將它們隱藏在params參數中? 如果我將動作粘貼到我的腳本文件跟蹤中,則代碼將在閃存中運行。多次調用動作令其令人難以置信。 – bissi

+0

這聽起來像函數調用開銷。參數傳遞可能不是問題。請記住,函數優化比腳本更好,所以確保一切都是函數。 – Peter