2013-11-28 4 views
1

벡터에서 그림 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 함수?) 가지고 있습니까? 당신은 또한 당신에게 몇 가지 편리한 추가 옵션을 제공하는 findpeaks을 사용할 수 있습니다신호 처리 도구 상자가있는 경우

%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

이 지금까지 내 솔루션입니다. (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

어쩌면 나는 코드 뒤에 당신의 아이디어를 이해하지 못했을 것입니다. 그러나 "% 알고리즘"아래에서 코드를 대체 할 때 인덱스 나 값 모두에 대한 정확한 결과를 얻지 못합니다. –