Matlab:使用“ismember”的代码性能问题

时间:2010-08-03 19:37:59

标签: matlab

我需要我的代码的这一部分运行得更快,因为它被多次调用。我是Matlab的新手,我觉得必须有一种方法可以做到这一点,而不是那么圆。您可以提供有关如何提高我所拥有的速度或其他功能的任何帮助,这将有助于我执行此任务,将不胜感激。

(任务是只获取“alldata”的行,其中第一列在“minintervals”的集合中为“alldataMinutes”。“minuteintervals”只是“alldata”列的最小值,增加了20到最大的alldata。

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 个答案:

答案 0 :(得分: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向量,对于集合{{1}中的alldata(:,1)元素,值为1(即true)否则,值为0(即false)。然后,您可以使用logical indexing轻松提取与minuteintervals中的行相对应的行,并将其放入index