필터 지우기
필터 지우기

Cumulative Summation down a matrix in loop keeping total per section

조회 수: 3 (최근 30일)
IDN
IDN 2022년 6월 10일
댓글: IDN 2022년 6월 11일
Hello!
I have 2 matrix, I would like to sum Matrix B values running cummulative given condition. The condition is that it starts to sum once Matrix A = 1 and stops when Matrix A = -1 and it goes on and on all the way down to the end of the data set. Thanks for the help!
Matrix A Matrix B CumSum (New Matrix)
0
0
0
1 0
1 0.02 .02
1 -12.09 -12.07
1 6.61 -5.46
-1 1.1 -4.36
0 0
1 0
1 -6.8 -6.8
1 -26.87 -33.67
1 2.67 -31
1 -9.99 -40.99
1 9.28 -31.71
1 -3.17 -34.88
-1 8.6 -26.28
0
0
0

채택된 답변

Abhijeet
Abhijeet 2022년 6월 11일
Hello IDN,
I can understand that you want to calculate prefix sum of vector B based on condition provided by vector A. I have added a code sample for the same task below.
Assumption made
  • Size of matrix A and B are equal
  • Every -1 in matrix A is preceded by +1
A = [ 0 0 0 1 1 1 -1 0 0 1 1 -1]
B= [ 0 0 0 34 4 4 6 0 0 12 3 3]
sz =size(A)
% matrix to store the cummalative sum
cumSum = zeros(sz)
%flag variable to tell when to start add elements
startSum = true
for idx=1:sz(2)
if A(idx)==0
continue
elseif A(idx)==1
if startSum==true
cumSum(idx)=B(idx)
startSum=false
else
cumSum(idx)=B(idx)+cumSum(idx-1)
end
else
cumSum(idx)=B(idx)+cumSum(idx-1)
startSum=true
end
end

추가 답변 (1개)

DGM
DGM 2022년 6월 11일
Following the what's implied by the example:
somedata = readmatrix('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1028400/Sum%20Sample.xlsx');
somedata = somedata(somedata(:,1)~=0,:); % get rid of padding rows
endmarkers = [0; find(somedata(:,1) == -1)];
nblocks = numel(endmarkers)-1;
S = cell(nblocks,1);
for k = 1:nblocks
% each block starts at endmarkers(k)+2 because the given example
% indicates that the first row where col1 is 1 is not considered when taking the sum
S{k} = cumsum(somedata(endmarkers(k)+2:endmarkers(k+1),2));
end
celldisp(S)
S{1} = 0.0200 -12.0700 -5.4600 -4.3600 S{2} = -6.8000 -33.6700 -31.0000 -40.9900 -31.7100 -34.8800 -26.2800
  댓글 수: 1
IDN
IDN 2022년 6월 11일
Thanks for taking the time to help me out. This is great but for this particular case i would like them to be lined up with the the Matrix B order. So i would like for it to keep its sequence down the rows (which includes the zeroes. Like the example below, the only issue with the example below is that i am not able to get it to work for some reason. Appreciate any further feedback!

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품


릴리스

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by