繁体   English   中英

有什么方法可以加速必须在20000+行中搜索16x字符串的Matlab代码吗?

[英]Any way to speed up Matlab code that has to search through 20000+ rows for a string 16x?

基本上,代码的工作方式是用户键入一个字符串(在我的情况下为7:29:29 AM-2:33:33 PM这样的时间戳),然后代码从excel中读取包含这些字符串的数据文件。它和所有数据:filename = get(handles.File,'String'); [数据,文本] = xlsread(filename,2);

IndexStart=strmatch(get(handles.StartTime,'String'),Text,'exact'); %start time
IndexEnd=strmatch(get(handles.EndTime,'String'),Text,'exact'); %end time

seconds = IndexEnd-IndexStart;
PlotData = Data([IndexStart: IndexEnd],:);

然后,它在“文本”中搜索该时间戳记的行号,并从该时间范围的数据中复制相应的数据部分,以便进行绘制。 此数据以1个样本/秒的速度收集了8个多小时,因此excel文件中很容易搜索30000行。 大量数据将在图表上标出不同事件的标签(假设它们为每个框放了一个事件,但我将if语句考虑在内)。 我现在进行此设置的方式是在gui中,用户将时间戳记值放置为字符串,然后代码搜索它们:

if isempty(get(handles.Task16End,'String')) 
IndexTextTask16End  = IndexStart;
else
IndexTextTask16End=strmatch(get(handles.Task16End,'String'),Text,'exact'); %row location for timestamp
end
Task16Span=IndexTextTask16End-IndexTextTask15End; %timespan of this event
Task16LineLocation=Task15LineLocation+ Task16Span/3600; %location for vertical line on graph

因此,我最多可以输入16个任务,这意味着程序必须在matlab矩阵中的每个可用单元格中搜索这些字符串,直到它遍历代码为止。 我怎样才能更有效地做到这一点? 也许将其设置为搜索,直到找到一个真正的空单元格? 这至少将我的搜索限制为给定数据,而不是整个可能的数组。

如果您正在读取Excel电子表格中的开始/结束时间并在MATLAB中完成所有其他工作,请考虑在datenum之后将时间转换为它们的datenum表示 xlsread 这样,您可以比较数字而不是字符串-更快。 鉴于此,您可以使用逻辑索引来构建所需的数据:

times   = datenum(Text); % assumed Text is just a cell array of times
t_start = datenum(get(handles.StartTime,'String'));
t_end   = datenum(get(handles.EndTime, 'String'));

plotData = Data(times >= t_start & times <= t_end); % note the single &, which is different than &&

strcmp通常比strmatch快很多; 我尝试了一下,它在我的系统上快得多,不知道为什么(就像快1000倍,我没想到会有那么大的差异)。

它返回的信息稍有不同- strcmp返回与1逻辑阵列哪里有相匹配的-所以要得到相同的输出与strmatch只是一个包装它find

IndexStart=find(strcmp(get(handles.StartTime,'String'),Text)); %start time

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM