2013-11-28 47 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結果 - 無論是索引或價值。 –