我需要代码的这一部分更快地运行,因为它被多次调用。我是Matlab的新手,我觉得好像必须有一种方法来回去并不是那么简单。您可以提供任何有关如何提高我所拥有的速度或其他功能以帮助我执行此任务的帮助,我们将不胜感激。
(任务是仅将第一分钟位于“minuteintervals”集中的“alldata”行转换为“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),:)= [];
最佳答案
这应该可以为您提供所需的东西,而且速度应该快得多:
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
是一个logical向量,其大小与alldata(:,1)
相同,对于alldata(:,1)
中位于minuteintervals
集合中的元素,其值为1(即true),否则为0(即false)。然后,您可以使用logical indexing轻松提取与index
中的行相对应的行,并将其放入alldataMinutes
中。关于matlab - Matlab:使用“ismember”的代码性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3400149/