2013-11-28 46 views
1

我想要查找矢量(如示例图中所示)中间隔1中的最大值和间隔2中的最大值的位置和值。给出区间1和2的边界。在矢量的间隔中查找最大值

example

NEW VERSION - 代码更可重复使用的

仅使用一个时间间隔为丹尼斯Jaheruddin提出并写成的函数。

function test 

%% Test data 
x=0:0.1:10-0.1; 
x_total=0:0.1:20-0.1; 

y=-(x-5.8).^2+25; 
y_total=[y,y+10]; 

figure(1); 
plot(x_total,y_total); grid on; 

interval=[12,18]; 

[maxValue,maxValuePositon] = findMaxInInterval(x_total,y_total,interval) 
[maxValue,maxValuePositon] = findMaxInInterval2(x_total,y_total,interval) 
end 

%% Algorithm 
function [maxValue,maxValuePositon] = findMaxInInterval(x,y,interval) 
    index = x>=interval(1) & x <= interval(2); 
    offset = find(index == 1,1,'first') -1; 
    [maxValue,indexMax] = max(y(index)); 
    maxValuePositon = x(indexMax+offset); 
end 

%% Algorithm - Alternative 
function [maxValue,maxValuePositon] = findMaxInInterval2(x,y,interval) 
    index = x>=interval(1) & x <= interval(2); 
    y_temp = y(index); 
    x_temp = x(index); 
    [maxValue,indexMax] = max(y_temp); 
    maxValuePositon = x_temp(indexMax); 
end 

这是老版本

我有一个解决方案,但我的代码似乎是相当复杂的给我。有人提出更直接的解决方案(或者简单地说是正确的MATLAB函数?)。这是迄今为止我的解决方案:

%Generate test function 
x=0:0.1:10-0.1; 
x_total=0:0.1:20-0.1; 

y=-(x-5).^2+25; 
y_total=[y,y+10]; 

figure(1); 
plot(x_total,y_total); grid on; 

interval1=[2,8]; 
interval2=[12,18]; 

%Algorithm 
index1 = x_total>=interval1(1) & x_total <= interval1(2); 
index2 = x_total>=interval2(1) & x_total <= interval2(2); 

offset1 = find(index1 == 1,1,'first') -1; 
offset2 = find(index2 == 1,1,'first') -1; 

disp('Maximum 1 and 2:'); 
[max1,indexMax1] = max(y_total(index1)) 
[max2,indexMax2] = max(y_total(index2)) 

disp('Position of Maximum 1 and 2:'); 
x_total(indexMax1+offset1) 
x_total(indexMax2+offset2) 
+2

这功能对我来说很好。我怀疑你可以做得更简单。 – bdecaf

+1

看起来没问题,但是如果你想要这样做超过2个时间间隔,你一定要防止代码重复每间隔。 –

回答

2

如果你有信号处理工具箱可以使用findpeaks,你提供了一些方便的附加选项也。 (documentation

x=0:0.1:10-0.1; 
x_total=0:0.1:20-0.1; 
y=-(x-5).^2+25; 
y_total=[y,y+10]; 

[y_peaks,idx] = findpeaks(y_total); 

x_peaks = x_total(idx); 

返回:

x_peaks = 
     5.0000  15.0000 

y_peaks = 
     25.0000  35.0000 

这是同样的结果就像你的算法后。对于图像中的信号来说,它会发现更多的峰值,但是您可以选择后来喜欢的信号。

% lower bound of your interval 
int_lb = 10; 
% upper bound of your interval 
int_ub = 20; 

% arguments and values of peaks in your specified interval 
x_peaks_int = x_peaks(find(x_peaks > int_lb & x_peaks < int_ub)) 
y_peaks_int = y_peaks(find(x_peaks > int_lb & x_peaks < int_ub)) 

返回:

x_peaks_int = 
     15.0000 
y_peaks_int = 
     35.0000 
0

正如你说的:简单的使用max函数在区间:)

% peak in the first interval 
ids1 = find(x_total >= interval1(1), 1) : find(x_total >= interval1(2), 1); 
[value1, index1] = max(y_total(ids1)); 

% peak in the second interval 
ids2 = find(x_total >= interval1(1), 1) : find(x_total >= interval1(2), 1); 
[value2, index2] = max(y_total(ids2)); 
+1

您的意思是:'[value1,offset1] = max(y_total(index1));' –

+0

@ Dennis Jaheruddin - 不,应该有索引,对应于数组'x_total'的不确定性。例如,如果你想在'x = 2'处找到'y'值,你应该首先在'x'中找到'2'值所在的索引,然后从'y'指数。 –

+0

也许我不明白你的想法背后的代码,但是当我替换我的代码下的“%算法”我没有得到rigth结果 - 无论是索引或价值。 –