2013-10-15 3 views
0

나는 어느 정도 sin 함수 인 dwc = [3001 x 2 double]을 가지고 있는데, dwc(:,2)에 최고 값을 찾는 for 루프가 있습니다. 가장 좋은 방법은 dwc(531,2)입니다. dwc(531,1)dwc(531,2)을 복용하기가 쉽고 M = [num_of_top_points x 2 double]을 만드는 것이 가장 좋은 방법이라고 할 수 있습니다.기본 MATLAB 변수 조작

다음 루프의 경우 어떻게해야합니까? 어떻게 작동하는 첫 번째 우리가 찾을 수 있습니다

j = 0; 
for i = 2:size(dwcL01,1)-1 
    if dwcL01(i,2) > dwcL01(i-1,2) && dwcL01(i,2) > dwcL01(i+1,2) 
     j = j+1; 
     ?? = dwcL01(i,:); 
    end 
end 

답변

4

이것은 당신이 당신의 루프

j = 0; 
M = []; 
for i = 2:size(dwcL01,1)-1 
    if dwcL01(i,2) > dwcL01(i-1,2) && dwcL01(i,2) > dwcL01(i+1,2) 
     j = j+1; 
     M(j, :) = dwcL01(i, :); 
    end 
end 

을 완료하는 방법입니다하지만 당신은

%//Some example data 
x = -4*pi:0.5:4*pi; 
y = cos(x); 
dwcL01 = [x(:), y(:)]; %// (:) just makes it a column 

%// Finding the peaks using diff and sign. Note that I add the first element to the beginning as diff reduces the size by one so this prevents offsetting 
F = diff(sign(diff([dwcL01(1,2);dwcL01(:,2)]))) < 0; 
M = [dwcL01(F,:)', dwcL01(F,:)'];  

plot(x, y, M(:,1), M(:,2), '*r') 

enter image description here

를 벡터화에 의해 훨씬 더 효율적으로이 작업을 수행 할 수 각 요소 연속 요소 쌍의 차이. 이제 기호가 바뀌면 최대 또는 최소값을 기록한 것입니다. 부호 변화가 음수이면 그레디언트는 양수에서 음수로 최대치가됩니다. 그래서 diff(sign())을 사용하여 부호가 바뀌는 지점을 찾은 다음 > 0을 사용하여 어디서나 false로 논리 매트릭스를 만들 수 있습니다. 그런 다음 논리적 색인을 사용하여 최대 값을 추출합니다.

+0

구름을 편집하면 어떻게 벡터화하는 방법의 예를 들어 답합니까? –

+0

@MaltheEisum 이것은 수치 모델에서 잘 작동할까요 ?? 'cos (x)'는 단지 숫자의 벡터입니다. 숫자입니다. Matlab의 기본값입니다. – Dan

+0

@MaltheEisum 그건 정말 문제가 아니야. 코드를 실행 해보십시오. 당신의 루프가 작동한다면,'diff' 솔루션도 동작 할 것입니다. – Dan

1

당신은 매트릭스 (의이 dwcL01_max를 호출하자)에 추가 할 수 있습니다 - 매트릭스의 크기는 각 루프를 변경하지만이 작동하기 때문에이 가장 빠른 방법이 아니다 :

dwcL01_max = [dwcL01_max dwcL01(i,:)]; 

다른 옵션은 사용하는 것 내장 findpeaks (신호 proc 도구 상자에서)

[~, dwcL01_peaks] = findpeaks(dwcL01(:,2)); 
dwcL01_max = dwcL01(dwcL01_peaks, :);