2013-05-14 107 views
1

這是我給出的代碼,但運行時間太長。我如何通過刪除嵌套for循環來加快速度?通過刪除嵌套for循環優化matlab代碼?

for iGroup = 1:length(groupIndices) 
      curGroupIndex = groupIndices(iGroup); 
      curChanIndices = chanIndices{iGroup}; 
      curChanNames = chanNames{iGroup}; 

      groupPropStruct = propsToStruct(propNames{curGroupIndex},propValues{curGroupIndex},REPLACE_STR,PREPEND_STR,ALWAYS_PREPEND); 
      groupStruct = struct('name',groupNames(iGroup),'props',groupPropStruct); 
      for iChan = 1:length(curChanIndices) 
       curChanIndex = curChanIndices(iChan); 
       chanPropStruct = propsToStruct(propNames{curChanIndex},propValues{curChanIndex},REPLACE_STR,PREPEND_STR,ALWAYS_PREPEND); 
       chanStruct = struct('name',curChanNames{iChan},'props',chanPropStruct,... 
        'data',[]); 
       chanStruct.data = data{curChanIndex}; 
       groupStruct.(TDMS_genvarname2(chanStruct.name,... 
        REPLACE_STR,PREPEND_STR,ALWAYS_PREPEND)) = chanStruct; 
      end 
      output.(TDMS_genvarname2(groupStruct.name,... 
       REPLACE_STR,PREPEND_STR,ALWAYS_PREPEND)) = groupStruct; 
     end 
+1

如果發現這個問題很難回答,不知道這段代碼應該做什麼。潛在地,這個任務可以在沒有嵌套循環的情況下實現,但並不是所有的嵌套循環都可以被消除。 – Schorsch 2013-05-14 16:42:57

回答

1

正如人們所說,很難說不知道,你的代碼實際上在做什麼。 也許你可以給你一個關於你的代碼的玩具示例?這將有所幫助。

無論如何,這裏有四個主要需要考慮的要點,for循環編寫MATLAB時:

1:當然,使用內置的MATLAB的功能,而不是for循環。它們是用c/Fortran編寫的,在SIMD,多線程等方面速度更快。

2:您的for-loops是連續的並且看起來是可分片的。考慮使用parfor循環,以在循環中使用多處理器功能。

3:您的for-loop是否包含在matlab函數中?如果不是這樣,就這樣做吧!這樣,來自MATLAB的yit編譯器就可以將您的循環編譯爲字節碼,而且速度更快!

4:如果你熟悉C++,寫一個mex函數。在這裏,您可以充分利用您機器的潛力。