2014-10-14 3 views
3

벡터의 누적 합계를 계산하려고하지만 합계가 음수가되면 합계를 중지하고 양수 요소에서 다시 시작합니다.누적 합계> = 0 Matlab의 제한

예 :

[1 1 -1 -1 -1 -1 1 1 1 1] 

가 정규 누적 합계는 다음과 같다 : :

우리는 벡터가

[1 2 1 0 -1 -2 -1 0 1 2] 

을하지만 난 원하는 :

[1 2 1 0 0 0 1 2 3 4] 

유일한에게 내가 할 수있는 해결책 나와 같은 최대 벡터의 요소를 통해 반복했다 :

test = [1 1 -1 -1 -1 -1 1 1 1 1]; 
testCumsum = zeros(size(test)); 

for i=1:length(test) 
    if i==1 
     testCumsum(i) = test(i); 
    else 
     testCumsum(i) = testCumsum(i-1) + test(i); 
    end 

    if testCumsum(i)<0 
     testCumsum(i) = 0; 
    end 
end 

더 많은 matlab-ish 솔루션이 있습니까?

(합계는 벡터가 상당히 커질 수있는 임의의 횟수 제외 될 수 있고, 요소는 단지 1 개수 일 수 -1)

+0

그것은 어려운 것 같다 여기

입력 A 및 출력 C에 대한 코드의 단순화이다. – tashuhka

+0

절대적인 명확성을 위해 루프 솔루션을 질문에 추가하는 것이 좋습니다 (정확한 해결책 일 수도 있습니다) – Dan

+1

변수 이름으로'cumsum'을 사용하지 마십시오 !!! Matlab 함수를 숨길 것입니다! – Dan

답변

2

이전 elemenet을 기준으로 각 elemenet을 결정해야하므로 벡터화 할 수 없습니다. 긍정적이고 부정적인 실행 영역을 찾을 수는 있지만 불필요하게 복잡 할 수 있으며 자신의 솔루션을 통해 얻을 수 있는지 여부는 알 수 없습니다. 배열의 다음 요소의 계산은 이전 요소를 더한 조건에서 계산에 의존하기 때문에

C=A; 
C(1) = max(C(1), 0); 
for k=2:numel(C) 
    C(k) = max(C(k-1)+C(k), 0); 
end 
+0

개를 주셔서 감사합니다 =) – Bastian35022

-1
call your vector x, 
y=x >0 
z=x.*y 
sum(z) 

은 y 벡터가 0/1 x의 요소가 0보다 큰 경우 z를 얻을 수있는 내적 값은 음수 값을 0으로 설정 한 다음 합계를 계산할 수 있습니다.

_Ah 내가 지금하고 싶은 것을 더 명확하게 볼 수 있습니다. 배열이 크고 parfor를 사용하여 블록 세그먼트를 분할하면 속도가 빨라집니다.

+0

문제는 여전히 합계가 감소하지만 0 미만이되지 않는 음수 값을 사용해야합니다. 귀하의 방법은 저에게 [1 2 2 2 2 2 3 4 5 6] – Bastian35022