我的强度点在上图中标记为粉红色,并且这些强度点存储在变量中,并以
的形式给出intensity_info =[ 35.9349
46.4465
46.4790
45.7496
44.7496
43.4790
42.5430
41.4351
40.1829
37.4114
33.2724
29.5447
26.8373
24.8171
24.2724
24.2487
23.5228
23.5228
24.2048
23.7057
22.5228
22.0000
21.5210
20.7294
20.5430
20.2504
20.2943
21.0219
22.0000
23.1096
25.2961
29.3364
33.4351
37.4991
40.8904
43.2706
44.9798
47.4553
48.9324
48.6855
48.5210
47.9781
47.2285
45.5342
34.2310 ];
我也有A,B和C点的信息,它们的计算方法如下:
[maxtab, mintab] = peakdet(intensity_info, 1); % maxtab has A and B information and
% mintab has C information
peakdet.m matlab代码可以在这里找到:(http://www.billauer.co.il/peakdet.html)。我想计算点D(其中强度值有视力增加,即如果我们从点A下降强度减小但在点D处强度略微增加)。从下图中可以看出,C点也可以位于D点的左侧,在这种情况下,如果我们从B点强度减小下来,在D点,强度会略有增加。下图中的强度值如下:
intensity_info =[29.3424
39.4847
43.7934
47.4333
49.9123
51.4772
52.1189
51.6601
48.8904
45.0000
40.9561
36.5868
32.5904
31.0439
29.9982
27.9579
26.6965
26.7312
28.5631
29.3912
29.7496
29.7715
29.7294
30.2706
30.1847
29.7715
29.2943
29.5667
31.0877
33.5228
36.7496
39.7496
42.5009
45.7934
49.1847
52.2048
53.9123
54.7276
54.9781
55.0000
54.9781
54.7276
53.9342
51.4246
38.2512];
和A,B和C点以与上述相同的方式计算。
在这些情况下如何计算D点?
答案 0 :(得分:0)
我不是MATLAB识字,但如果'tabs'是子表,那么也许你可以操纵它们来创建其他子表......就像(我重复,文盲)
left_of_graph = part of graph from A to C
right_of_graph = part of graph from C to B
left_delta = some fraction of the difference between A's y-value and C's y-value
right_delta = some fraction of the difference between C's y-value and B's y-value
[left_maxtab,left_mintab] = peakdet(left_of_graph,left_delta)
[right_maxtab,right_mintab] = peakdet(right_of_graph,right_delta)
我做有一些峰值分析的经验,所以我会说这有助于而不是回答问题。您可以找到所需的所有峰值,但这并不意味着数据值得眯眼。噪音和不完美的分辨率是真实的。快乐狩猎!
PS你也可以扫描比整个乐队中的两个邻居更高的所有点。可以保证不会错过任何“真正的”最大值,但是为了给你提供比你可以计算更多的'假'最大值(虽然你的数据看起来非常流畅!)。
答案 1 :(得分:0)
您正在寻找的解决方案是基于迭代的数值方法,在您的特定情况下,二分是最适合的原因,因为统一顺序搜索等其他人不会将间隔作为输入。 这是二分法的实现:
function [ a, b, L ] = Bisection( f, a, b, e, d )
%[a,b] is the interval for your local maxima; e is the error for the result and d is the step(dx).
L = b - a;
while(L > e)
xa = ((a + b)/2) - d/2;
xb = ((a + b)/2) + d/2;
ya = subs(f,xa);
yb = subs(f,xb);
if(ya < yb)
a = xa;
else
b = xb;
end
L = b - a;
end
end
之前的方法非常有效且易于使用,尽管其他方法甚至更好(在性能方面),如Fibonacci和Gold Section方法。
干杯。
答案 2 :(得分:0)
我找到了替代解决方案。 extrema.m帮助在上面两个garphs中找到了D点。 extrema.m可以从(http://www.mathworks.com/matlabcentral/fileexchange/12275-extrema-m-extrema2-m)下载并以下列方式用于查找D点:
[ymax,imax,ymin,imin] = extrema(intensity_info);
figure;plot(x,intensity_info,x(imax),ymax,'g.',x(imin),ymin,'r.');