2013-07-15 3 views
0

다음과 같은 코드를 만들려고합니다. v가 음수에서 양수로 0이 교차 할 때,이 값은 다른 제로 교차점 (최소 및 최대)에서 최소 4 일 이상 분리되었습니다. 오른쪽 방향), 그리고 만약 내가 8 원소 (제로 교차점에서부터)를 오른쪽으로 가져 간다면, 적어도 80 %의 양은 긍정적이었고, 6 원소를 왼쪽으로 (영 교차점에서) 취하면, 적어도 60 % 시대의 부정적인했다. 이러한 조건을 만족하는 시리즈는 책갈피로 저장되거나 위치와 함께 저장됩니다. 당신의 도움에 대한조건문 - MATLAB

감사합니다 .. 내가 위치를 추출 할 수있는이 프로그램으로

v=[-1 2 3 -9 -8 -6 -7 -9 -3 -2 -5 -6 -3 1 6 8 5 9 7 4 5 6 -5 -7 2 5 3 2 -2 -1 -5 -4 1 4 3 5 6 3 4 3 -4 5] 

때 긍정적에서 부정적 또는 그 반대의 경우도 마찬가지 값 변경.

vexample=v; 
vexample(vexample >= 0) = 1; 
vexample(vexample < 0) = -1; 
z = vexample > 0; 
id = find([true;diff(vexample.') ~= 0]); 
k = diff([id;numel(vexample)+1]); 
out = -k; 
out(z(id)) = k(z(id)); 
clear id k vexample z 

out = -1 2 -10 9 -2 4 -4 8 -1 1 

그리고 지금, 나는 조건을 충족 시리즈의 부분을 감지하기 위해 노력하고있어,하지만 난 문제가있어 그

답변

2

솔직히 말해서, 난 당신이 자신과 혼란 생각 이 질문에 대한 독자는 당신이 필요로하는 것 이상입니다. 위의 코드에서 MATLAB을 능숙하게 사용하는 것처럼 보이므로 내 대답은 부분적으로 분해하는 것입니다.

먼저 제로 크로싱의 모든 인덱스를 찾을 수 있습니다 (I 그 ID가 무엇인지 생각?)

지금 당신이 좀 간단하게 서로의 4 내에있는 인덱스를 제거 할 수 있습니다. for 루프 및 if 문을 사용하여 벡터를 유효하지 않은 벡터로 만듭니다 (4 이내). for 루프가 끝나면 삭제하십시오.

내가 오른쪽으로 (제로 크로싱부터) 요소를 가지고가는 경우에, 적어도 80 % :

솔직히 말해서, 나는 당신도이 부분에 뭘 하려는지 취소하고 있지 않다 날은 긍정적이었고, 왼쪽에 6 개의 원소를 가져 가면 (제로 교차점에서), 적어도 60 %는 부정적이었습니다.

그러나 문 ..

모든 멋진 프로그래밍 프로젝트는 아기 단계로 수행하고 난 당신이뿐만 아니라 시작하는 것이 좋습니다 어떻게 인 경우에 그 몇 가지 기본으로 충분히 쉽게해야합니다.

0

이것은 꽤 혼란 스럽습니다. 실제로는 단어가 아닌 코드/수학에서 필요한 것을 정확하게 다시 정의하고 재정의하는 것이 가장 좋은 경우가 많습니다. 대신 오른쪽 (제로 크로싱에서)

8 요소 예를 들어, 일의 적어도 80 %는 자연적를 돌려서

%Find all N such that 
sum(sign(v((N):(N+7)))) >= ceil(0.60 * 8) 

사용해

양성인 (N+7) 또는 (N+8)과 같은 몇 가지 질문.이 시점에서

%Given the input 
v=[-1 2 3 -9 -8 -6 -7 -9 -3 -2 -5 -6 -3 1 6 8 5 9 7 4 5 6 -5 -7 2 5 3 2 -2 -1 -5 -4 1 4 3 5 6 3 4 3 -4 5]; 

%Find all N such that 
% **** low to high zero crossing 
% (1) v(N) > 0 
% (2) v(N-1) < 0 
% **** +/- 4 days of no zero crossings 
% (3) all(v((N-5):(N-1)) < 0) 
% (4) all(v((N):(N+4)) > 0) 
% **** +/- 8 days of rare zeros crossings 
% (3) sum(sign(v((N-8):(N-1)))) <= - floor(0.60 * 8) 
% (4) sum(sign(v( (N):(N+7)))) >= ceil(0.80 * 8) 

(당신은 나의 번역에 동의 한 번)는 적절한 루프를 작성하는 꽤 쉽게보다 :

내가 요구 사항을 귀하의 단락이 일에서 간단한 시도를했습니다

%Simple loop 
maskResult = false(size(v)); 
vSign = sign(v); 
for ix = 9:(length(v)-8) 
    if ... 
      all(vSign((ix-5):(ix-1)) < 0) && ... 
      all(vSign((ix):(ix+4)) > 0) && ... 
      sum(sign(vSign((ix-8):(ix-1)))) <= - floor(0.60 * 8) && ... 
      sum(sign(vSign( (ix):(ix+7)))) >= ceil(0.80 * 8) 
     maskResult(ix) = true; 
    end 
end 

그리고 당신은 사용하여 결과를 확인할 수 있습니다

find(maskResult) %returns 14, indicating the -3 -> 1 transition