2010-08-03 39 views
3

我需要這段代碼運行得更快,因爲它被稱爲很多次。我對Matlab很陌生,我覺得好像有一種方法可以做到這一點,但不是那麼完整。值得讚賞的是,你可以給予的任何幫助,以提高我擁有的功能或其他功能,以幫助我執行此任務。 (任務是僅將「alldata」中的第一列在「minintervals」集合中的行轉換爲「alldataMinutes」。「minuteintervals」只是「alldata」列的最小值,增加20到20。最大ALLDATA的Matlab:代碼性能問題使用「ismember」

minuteintervals= min(alldata(:,1)):20:max(alldata(:,1)); %20 second intervals 
alldataMinutes= zeros(30000,4); 
counter=1; 
for x=1:length(alldata) 
    if ismember(alldata(x,1), minuteintervals) 
     alldataMinutes(counter,:)= alldata(x,:); 
     counter= counter+1; 
    end 
end 
alldataMinutes(counter:length(alldataMinutes),:)= []; 

回答

1

這應該給你想要的東西,它應該是明顯更快。

minuteintervals = min(alldata(:,1)):20:max(alldata(:,1)); %# Interval set 
index = ismember(alldata(:,1),minuteintervals); %# Logical index showing first 
               %# column values in the set 
alldataMinutes = alldata(index,:); %# Extract the corresponding rows 

這是通過傳遞值的矢量的功能ISMEMBER,而不是一次傳遞一個值。輸出index是與alldata(:,1)相同大小的logical矢量,對於集合minuteintervals中的alldata(:,1)的元素,其值爲1(即爲真),否則爲0(即,假)。然後,您可以使用logical indexing輕鬆提取與index中對應的行,並將它們放在alldataMinutes中。

+2

使用ISMEMBC(http://UndocumentedmMtlab.com/blog/ismembc-undocumented-helper-function/)應該比ISMEMBER提高性能。在這種情況下,與gnovice的矢量化相比,這種提升可以忽略不計,但只是FYI – 2010-08-04 03:48:31

+1

@Yair:很高興知道,儘管鏈接中存在拼寫錯誤。對於任何感興趣的人,這裏是[正確的鏈接](http://undocumentedmatlab.com/blog/ismembc-undocumented-helper-function/)。 – gnovice 2010-08-04 04:07:32

+0

感謝您指出gnovice :-) – 2010-08-07 18:24:29