Matlab:代码性能问题使用“ismember”
问题描述:
我需要这段代码运行得更快,因为它被称为很多次。我对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),:)= [];
答
这应该给你想要的东西,它应该是明显更快。
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
中。
使用ISMEMBC(http://UndocumentedmMtlab.com/blog/ismembc-undocumented-helper-function/)应该比ISMEMBER提高性能。在这种情况下,与gnovice的矢量化相比,这种提升可以忽略不计,但只是FYI – 2010-08-04 03:48:31
@Yair:很高兴知道,尽管链接中存在拼写错误。对于任何感兴趣的人,这里是[正确的链接](http://undocumentedmatlab.com/blog/ismembc-undocumented-helper-function/)。 – gnovice 2010-08-04 04:07:32
感谢您指出gnovice :-) – 2010-08-07 18:24:29