登录论坛

查看完整版本 : Matlab:使用“ ismember”的代码性能问题


poster
2019-12-10, 20:48
我需要代码的这一部分更快地运行,因为它被多次调用。我是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 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html)而不是一次传递一个值来工作。输出index是一个逻辑 (http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f2-97022.html)向量,其大小与alldata(:,1)相同,对于在minuteintervals内设置的minuteintervals alldata(:,1)元素,其值为1(即true),而值为0(即,即否)。然后,您可以使用逻辑索引 (http://www.mathworks.com/access/helpdesk/help/techdoc/math/f1-85462.html#bq7egb6-1) ,以方便地提取相当于个在行index ,将它们放置在alldataMinutes 。



更多&回答... (https://stackoverflow.com/questions/3400149)