2014-12-23 49 views
2

說我有它由一個項目:加載變量成在Matlab從的Structs功能

  • 處理所有我的模擬運行的主要腳本
  • 幾個較小的功能
  • 一對夫婦包含數據的結構

在腳本中,我將在for循環內多次訪問函數(在分鐘長的模擬中有一千多次)。每個函數也在尋找結構文件中包含的數據作爲其計算的一部分,這些參數通常是在仿真過程中固定的參數,但需要在運行之間手動更改以觀察效果。

由於通常這些函數構成運行時間的大部分,我試圖節省時間,因爲我的模擬不能實時運行(最終目標),並且我失去了很多時間傳遞變量/函數週圍的參數。所以,我有三個想法,試圖做到這一點:

  1. 加載主仿真的結構,然後依次通過每個變量的函數在一個大的參數(當前解決方案)的形式。
  2. 每次調用函數時加載結構體。
  3. 定義結構爲全局變量。

從系統效率(與項目開發最相關)以及可能因爲我不是來自「良好實踐」角度的專家程序員而言,最佳解決方案是什麼?我還沒有考慮過另一種選擇嗎?

+3

第一個對我來說似乎最有效率。 – freude

+1

傳遞和引用結構變量是一種高效的操作。在別處尋找以優化軟件。看看你當前從一個循環調用的函數是否可以被矢量化來一次處理整個。 – Peter

+0

向我們提供一些關於代碼放慢速度的更多信息會有所幫助。我提供了一個答案,但考慮到你對matlabgui的回答所說的一些話,我不確定它是否會有所幫助。 – TTT

回答

1

正如上面在評論中提到的 - 第一項是最好的一個。

您是否使用過探查器來確定您的代碼佔用了大部分時間?

profile on % run your code profile viewer

注:如果您在您的孩子的功能修改您的輸入結構 - >這將需要更多的時間,但如果你只是引用他們,那麼這不應該是一個問題。

+0

感謝您的答案,是的,我一直在使用探查器瞭解過程。作爲一名物理學家,我不擅長編寫特別高效或「優秀」的代碼,而在某些地方,時間是必要的,我的論點開始採取的尺寸變得很愚蠢。如果你想要具體的一些結構值用一個函數改變,然後傳回到模擬的其餘部分再次讀取。這個變化的函數雖然很小但不會影響太大,通常是瓶頸的更大的函數。 – Folau

0

Matlab在函數之間傳遞參數時會做所謂的「lazy copy」。這意味着它將指向數據的指針傳遞給函數,而不是創建該數據的新實例,這是非常有效的內存和速度。但是,如果您在子例程中對該數據進行了任何更改,則必須創建該參數的新實例,以便不會覆蓋主函數中的參數值。你對matlabgui的迴應表明你正在那樣做。所以,子程序每次調用時都可能會創建一個新的結構體,即使它只修改該結構體的一小部分值。

如果你的子程序正在改變數組的一小部分,那麼你最好的辦法就是將這個小部分傳給它,然後分配你的輸出。例如,

[modified_array] = somesubroutine(struct.original_array); 
struct.original_array=modified_array; 

你也可以做到這一點,在短短一行。從概念上講,傳遞給子例程的數據越少,內存佔用量就越小。我還建議閱讀in-place operations,因爲它與此有關。

此外,作爲一般規則,不要在Matlab中使用全局變量。我沒有親身體驗過,也沒有讀過他們真正更快的實例。