Add the rows of a Matrix until a certain value.
5 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
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 Commenti
Risposta accettata
Guillaume
il 23 Dic 2015
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 Commento
Walter Roberson
il 23 Dic 2015
Modificato: Walter Roberson
il 23 Dic 2015
Note: this code will have problems if a row does not meet the threshold.
Più risposte (1)
Walter Roberson
il 23 Dic 2015
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 Commento
Walter Roberson
il 23 Dic 2015
More compactly:
cA = cumsum(A, 2);
k = sum(cA < 15, 2).' + 1;
nA = size(A,1);
sum1 = cA((0:nA-1)*nA + k);
Vedere anche
Categorie
Scopri di più su Cell Arrays in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!