在MATLAB中查找时间间隔内的峰间值

在MATLAB中查找时间间隔内的峰间值,matlab,for-loop,Matlab,For Loop,我把数据组织成两个矩阵,“时间”和“数据”。我想找到“数据”矩阵第一列的峰间值。我试图通过遍历数据点来实现这一点,每次500个点,并找到每个间隔内的最大值和最小值。峰值是通过将两个值的绝对值相加得到的 峰值=绝对值(最大值)+绝对值(最小值) 然后将这些值保存到excel电子表格(如果它们大于1500),以便以后查看。然而,数据矩阵大约有1798824行,这个过程非常繁琐 有没有更好的方法来编写此代码以加快进程?这些环看起来还好吗?如果“if”条件不满足,我试图找到一种直接进入下一次迭代的方法,

我把数据组织成两个矩阵,“时间”和“数据”。我想找到“数据”矩阵第一列的峰间值。我试图通过遍历数据点来实现这一点,每次500个点,并找到每个间隔内的最大值和最小值。峰值是通过将两个值的绝对值相加得到的

峰值=绝对值(最大值)+绝对值(最小值)

然后将这些值保存到excel电子表格(如果它们大于1500),以便以后查看。然而,数据矩阵大约有1798824行,这个过程非常繁琐

有没有更好的方法来编写此代码以加快进程?这些环看起来还好吗?如果“if”条件不满足,我试图找到一种直接进入下一次迭代的方法,但我不确定如何在MATLAB中实现这一点

%maxV=maximum thrust value
%minV=minimum thrust value
%maxI=index of maximum thrust
%minI=index of minimum thrust
%peakV=peak thrust value
%peakT=time at which peak thrust value occurred

d=dir('*');%Creates matrix d which contains all the file names in the folder.
d=d(~[d.isdir]);% removes folders from the list (if some exist)
d={d.name}.';%removes the locations of the files, leaving only the names.
nf=numel(d);%calculates the variables in d
j=zeros([1,15]); %creates starting matrix to which the peak result, indexes and values can be added to

for i=3:nf


[time,data,sensors]=IMO_read_time(d{i},1); %executes function that reads binary and gives data in 3 matrices(time,data,sensors)

nrows=size(data,1); %number of data rows in matrix A
peakvalues=round((nrows/500)); %number of peak results for sampling frequency of 500Hz

for p=1:peakvalues %range of possible peak results
    for n=1:500:nrows %number of data points to be read(interval of 500)
        k=n+499;      %stating end value to be read in each interval
        if k<=nrows   %end value must be smaller than number of rows in data

        [maxV maxI]=max(data(n:k,1)); %finds maxV and maxI within 500 data points
        [minV minI]=min(data(n:k,1)); %finds maxV and maxI within 500 data points

        maxT=time(maxI,1); %finds time of maximum value
        minT=time(minI,1); %finds time of minimum value

        peakV=abs(maxV)+abs(minV); %finds peak to peak between maxV and minV

        if peakV>1500 


    Real_maxT=datevec(datenum(1970,1,1)+(maxT/86400)); %converts UNIX time into UPS format
    Real_minT=datevec(datenum(1970,1,1)+(minT/86400)); %converts UNIX time into UPS format


    M=[peakV maxI minI Real_maxT Real_minT]; %creates matrix M with values of interest
    format long

    Newj=[j; M]; %adds M onto matrix j to create matrix Newj
    j=Newj; %j then becomes Newj for next iteration

    ind=find(j(:,1),1,'last'); %gives the index of the last value of matrix j
    p=sprintf('A%d',ind); %gives the row number that the data will be written to in excel      spreadsheet
    xlswrite('20131221_PeakValues_trial1', M, 1, p); %saves matrix M in excel spreadsheet, sheet1, row n

        end;

        end;

    end
end
%maxV=最大推力值
%minV=最小推力值
%maxI=最大推力指数
%minI=最小推力指数
%peakV=峰值推力值
%peakT=出现峰值推力值的时间
d=dir('*');%创建包含文件夹中所有文件名的矩阵d。
d=d(~[d.isdir]);%从列表中删除文件夹(如果存在)
d={d.name};%删除文件的位置,只保留名称。
nf=numel(d);%计算d中的变量
j=零([1,15]);%创建可添加峰值结果、索引和值的起始矩阵
对于i=3:nf
[时间、数据、传感器]=IMO_读取时间(d{i},1);%执行读取二进制文件并以3个矩阵(时间、数据、传感器)给出数据的函数
nrows=大小(数据,1);%矩阵A中的数据行数
峰值=四舍五入((nrows/500));%500Hz采样频率的峰值结果数
对于p=1:PeakValue%可能峰值结果的范围
对于n=1:500:nrows%要读取的数据点数量(间隔500)
k=n+499;%说明每个间隔中要读取的结束值
如果k1500
Real_maxT=datevec(datenum(1970,1,1)+(maxT/86400));%将UNIX时间转换为UPS格式
Real_minT=datevec(datenum(1970,1,1)+(minT/86400));%将UNIX时间转换为UPS格式
M=[peakV maxI minI Real_maxT Real_minT];%使用感兴趣的值创建矩阵M
格式长
Newj=[j;M];%将M添加到矩阵j以创建矩阵Newj
j=Newj;%然后,j成为下一次迭代的新j
ind=find(j(:,1),1,'last');%给出矩阵j的最后一个值的索引
p=sprintf('A%d',ind);%给出将在excel电子表格中写入数据的行号
xlswrite('20131221_PeakValues_trial1',M,1,p);%将矩阵M保存在excel电子表格第1页第n行
结束;
结束;
结束
结束

结束

删除循环会导致此代码块:

nrows=size(data,1); %number of data rows in matrix A
peakvalues=round((nrows/500)); %number of peak results for sampling frequency of 500Hz

dataBlocks = reshape(data(1:500*peakvalues),500,peakvalues);

[maxV,maxIdx] = max(dataBlocks);
[minV,minIdx] = min(dataBlocks);
peakV = abs(maxV) + abs(minV);

maxT = time(maxIdx + ((1:peakvalues)-1)*500,1);
minT = time(minIdx + ((1:peakvalues)-1)*500,1);

interestingIdx = (peakV>1500);

upsMaxT = datevec(datenum(1970,1,1)+(maxT(interestingIdx)/86400)); %converts UNIX time into UPS format
upsMinT = datevec(datenum(1970,1,1)+(minT(interestingIdx)/86400)); %converts UNIX time into UPS format

M = [peakV(interestingIdx)' maxIdx(interestingIdx)' minIdx(interestingIdx)' upsMaxT upsMinT];

xlswrite('20131221_PeakValues_trial1', M, 1);
附加说明:您正在一个
p
上循环,但我不明白为什么要这样做。其次,在循环内部为该
p
分配一个字符串值



< > >强>编辑< /强>:我没有考虑你的第一个循环,但是这个循环不容易被移除,因为它在要读取的文件上循环。

如果你有工具箱, FordPosis可能对你有用。谢谢你的回答,但不幸的是我没有工具箱。也许我会为此而得到它;您正在循环中增长
j
,不需要
newJ
,而且如果您正在
j
中存储所有内容,请将
xlswrite
放在循环之外,这样您就不必一直想在哪里写入新数据。更多细节将取决于你的峰值形状。我看不到任何问题或简单的方法来提高速度。您可能希望使用
peakV=maxV-minV
计算峰值,以考虑
maxV
为负值或
minV
为正值的可能性。这是一个有趣的问题,我会再考虑一下,正如@nkjt所说,如果可能的话,将
xlswrite
移出循环。xlswrite是一个非常慢的函数,每次调用可能需要半秒钟。此代码看起来比我的代码整洁多了,谢谢!唯一的问题是它没有更快,因为xls写入仍在进行。我刚刚意识到:可以通过一次编写完整的M来减少对xlswrite的调用,所以我更新了代码。这实际上应该会加快很多。我尝试了新版本的代码,速度快了很多,但是我不得不调整maxT和minT部分,但是我最后得到的时间看起来不正确。你能解释一下maxT=time0(maxIdx+((1:peakvalues)-1)*500,1)是什么吗;这部分是什么意思?它表示索引超出了矩阵尺寸。我猜这是由
舍入
功能造成的-您应该用
舍入
(舍入为零,因此忽略最后一个小于500个元素的块)。代码段的作用是将
maxIdx
转换为正确的时间索引,以获得
maxT
。由于
数据的整形
,我们需要移动时间数组的索引值(未整形)。