Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding up different number of elements from each row

I have a main matrix, say

A=magic(5);

and also a vector

v=[1;3;5;2;2];

I want to add up row-wise the elements of A in this way: add first row from the v(1)st element to the end, second row from the v(2)rd element to the end, third row from the v(3)th element to the end, and so on.

I know that I can do this using for-loop. But I want to know if there is a vectorized way to do it.

edit: Let me clarify my question with an example: Assume A and v as above.

A =

 17    24     1     8    15
 23     5     7    14    16
  4     6    13    20    22
 10    12    19    21     3
 11    18    25     2     9

and

v =

 1
 3
 5
 2
 2

Now I want a way to get the following results:

answer =
 65  % 17+24+1+8+15
 37  % 7+14+16
 22  % 22
 55  % 12+19+21+3
 54  % 18+25+2+9
like image 266
Mehrdad Avatar asked Mar 25 '23 04:03

Mehrdad


1 Answers

You can use cumsum along the rows. The solution is a bit complex, so I'll start with a simpler example:

Suppose you want to sum all elements of the i-th row of A till (including) the v(i)-th place: res_i = \sum_{k=1..v(i)} A_ik

m = size(A,1); % num of rows
csA = cumsum(A, 2); % cumsum along rows
res = csA( sub2ind( size(A), 1:m, v ) ); % pick the vi-th column for the i-th row

Now, for your question, since you want the sum of all elements from v(i) to the end, we need to flip A and change v accordingly

[m n] = size(A);
fA = fliplr(A);
fv = n + 1 - v; % flip the meaning of v
csA = cumsum( fA, 2 ); 
res = csA( sub2ind( [m n], 1:m, fv ) ); % should do the trick...
like image 114
Shai Avatar answered Apr 01 '23 09:04

Shai