2010-08-03 101 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