以前问过这个问题,以下是eight大人给出的参考,希望对你有用。
d = diff(x);
n = length(d);
d1 = d(1:n-1);
d2 = d(2:n);
indmin = find(d1.*d2 0
if fins(end) == m
if length(debs) ...
恩,正是这个: extr 函数 函数不懂时可以查看matlab里的“帮助”,我很多时候就是看帮助的
回复 #15 happy 的帖子
完全同意,代码简洁好用回复 #16 bao123 的帖子
求极值的一般步骤是:a):求f'(x);
b):求f'(x)=0的全部的解——驻点;
c):判断在驻点两侧的变化规律,即可判断出函数的极值。
find(diff(sign(diff(data)))==-2)就是依照此步骤写出的代码,diff(data)有可能大于0,=0,小于0,我们要找的是相邻两点符号一正一负才是极值区间,如果不理解,你可以把此表达式拆解,分步计算进行观察 “ if fins(end) == m”求教这个m代表的是什么意思?
回复 20楼 mason2008 的帖子
好像没有复制齐或有误!? 个人没细看m的确未定义!
extr.m完整源程序
在网上找到了如下:extr函数的链接: http://perso.ens-lyon.fr/patrick.flandrin/EDSFA_mfiles/extr.m
function = extr(x,t);
% = EXTR(x,t) finds extrema and zero-crossings
%
% inputs : - x : analyzed signal
% - t (optional) : sampling times, default 1:length(x)
%
% outputs : - indmin = indices of minima
% - indmax = indices of maxima
% - indzer = indices of zero-crossings
if(nargin==1),t=1:length(x); end
m = length(x); x1=x(1:m-1); x2=x(2:m); indzer = find(x1.*x2<0);
if any(x == 0)
iz = find( x==0 ); indz = [];
if any(diff(iz)==1)
zer = x == 0; dz = diff();
debz = find(dz == 1); finz = find(dz == -1)-1;
indz = round((debz+finz)/2);
else
indz = iz;
end
indzer = sort();
end
d = diff(x);
n = length(d); d1 = d(1:n-1); d2 = d(2:n);
indmin = find(d1.*d2<0 & d1<0)+1;
indmax = find(d1.*d2<0 & d1>0)+1;
if any(d==0)
imax = []; imin = [];
bad = (d==0); dd = diff();
debs = find(dd == 1); fins = find(dd == -1);
if debs(1) == 1
if length(debs) > 1
debs = debs(2:end); fins = fins(2:end);
else
debs = []; fins = [];
end
end
if length(debs) > 0
if fins(end) == m
if length(debs) > 1
debs = debs(1:(end-1)); fins = fins(1:(end-1));
else
debs = []; fins = [];
end
end
end
lc = length(debs);
if lc > 0
for k = 1:lc
if d(debs(k)-1) > 0
if d(fins(k)) < 0
imax = ;
end
else
if d(fins(k)) > 0
imin = ;
end
end
end
end
if length(imax) > 0, indmax = sort(); end
if length(imin) > 0, indmin = sort(); end
end
[ 本帖最后由 ChaChing 于 2009-12-9 18:33 编辑 ] 回复 22 # mason2008 的帖子
谢谢你的分享,刚好有用~
页:
1
[2]