Add the rows of a Matrix until a certain value.
6 次查看(过去 30 天)
显示 更早的评论
Hi All, I have this code which will add values in a vector until a certain value and then give the corresponding location. However I would like to modify this so that it would work with a matrix. Here is the current code.
A=[3 4 10 3 9 10 12 4 11 9 11 10]';
sum1=0;
k=1;
while sum1<15
sum1=sum1+A(k);
k=k+1;
end
sum1
k = k-1;
Now the output is sum1=17 and k = 3. If A instead was A=[3 4 10 3 9 10; 12 4 11 9 11 10], then ideally the output would be sum1 = 17 16 and k = 3 2
Any help would be appreciated.
0 个评论
采纳的回答
Guillaume
2015-12-23
A = [3 4 10 3 9 10 12 4 11 9 11 10]';
sumA = cumsum(A);
k = find(sumA >= 15, 1)
sum1 = sumA(k)
You can use cumsum on a matrix to sum each row. The difficulty is that find does not work on rows, so you have to use a loop or split the rows into a cell array and use cellfun on that:
A = [3 4 10 3 9 10; 12 4 11 9 11 10];
threshold = 15;
rowsums = num2cell(cumsum(A, 2), 2);
thresholdcol = cellfun(@(row) find(row >= threshold, 1), rowsums)
thresholdsum = cellfun(@(row, k) row(k), rowsums, num2cell(thresholdcol))
1 个评论
Walter Roberson
2015-12-23
编辑:Walter Roberson
2015-12-23
Note: this code will have problems if a row does not meet the threshold.
更多回答(1 个)
Walter Roberson
2015-12-23
cA = cumsum(A, 2);
k = reshape(sum(cA < 15,2) + 1, 1, []);
sum1 = cA(sub2ind(size(cA), 1:size(cA,1), k));
Guaranteed to break if one of the rows does not reach 15.
1 个评论
Walter Roberson
2015-12-23
More compactly:
cA = cumsum(A, 2);
k = sum(cA < 15, 2).' + 1;
nA = size(A,1);
sum1 = cA((0:nA-1)*nA + k);
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Cell Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!