Cumulative Summation down a matrix in loop
1 次查看(过去 30 天)
显示 更早的评论
Hello!
I have 2 matrix, I would like to sum Matrix B values 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
0
0
0
-1 0
-1 0.02
-1 -12.09
-1 6.61
1 1.1 -4.36 CumSum
0 0
-1 0
-1 -6.8
-1 -26.87
-1 2.67
-1 -9.99
-1 9.28
-1 -3.17
1 8.6 7.39 CumSum
0
0
0
2 个评论
采纳的回答
Adam Danz
2022-2-9
编辑:Adam Danz
2022-2-9
If and only if the groups marked by A=-1 to A=1 are not interruped by any other values in A and a 1 does not appear before the first -1, the solution is,
T = readtable('Sum Sample.xlsx')
startIdx = find([false;diff(T.MatrixA==-1)==1]);
stopIdx = find([false;diff(T.MatrixA==1)==1]);
groupSums = arrayfun(@(start,stop)sum(T.MatrixB(start:stop)),startIdx,stopIdx)
Or perhaps you want,
T.CumSum(stopIdx) = groupSums
4 个评论
Adam Danz
2022-2-10
Just saw your message now. Glad you worked it out. That line merely places data within the table T so nothing should be coming out horizontally.
更多回答(1 个)
Highphi
2022-2-9
matrixA = [0 0 0 -1 -1 -1 -1 1 0 -1 -1 -1 -1 -1 -1 -1 1 0 0 0]'; % for ref
matrixB = [0 0 0 0 0.02 -12.09 6.61 1.1 0 0 -6.8 -26.87 2.67 -9-99 9.28 -3.17 8.6 0 0 0]'; % for ref
state = 0;
matrixSums = zeros(size(matrixA,1), 1);
for i = 1:size(matrixA, 1)
temp = matrixA(i);
if (temp == -1) && (state == 0)
state = 1;
cumSum = matrixB(i);
elseif (state == 1) && (temp ~= 1)
cumSum = cumSum + matrixB(i);
elseif (state == 1) && (temp == 1)
cumSum = cumSum + matrixB(i);
matrixSums(i) = cumSum;
state = 0;
end
end
outMat = [matrixA, matrixB, matrixSums]
2 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!