Fastest pairwise row sums

3 views (last 30 days)
Alexander Shtof
Alexander Shtof on 26 Feb 2019
Answered: Jos (10584) on 26 Feb 2019
I have two matrices A and B, and I would like to compute a matrix C whose rows are all possible combinations of the sum of a row of A and a row of B. What would be the fastest way to perform the computation?
Additional question - what if A and B are both gpuArrays?
Update - Example
Say A is a matrix of 3 rows and B is a matrix of 2 rows, then I would like C to be the matrix
C = [A(1, :) + B(1, :);
A(1, :) + B(2, :);
A(2, :) + B(1, :);
A(2, :) + B(2, :);
A(3, :) + B(1, :);
A(3, :) + B(2, :)];
  2 Comments
madhan ravi
madhan ravi on 26 Feb 2019
Edited: madhan ravi on 26 Feb 2019
illustrate with a short example

Sign in to comment.

Accepted Answer

Adam
Adam on 26 Feb 2019
Edited: Adam on 26 Feb 2019
C = repelem( A, size( B, 1 ), 1 ) + repmat( B, size( A, 1 ), 1 );
Should be the same for gpuArrays too. Whether it is fastest for runtime or not is another matter entirely. There are any number of possible ways of doing it - this is just one. I certainly don't have time to think up, implement and time all of them!
  2 Comments
Alexander Shtof
Alexander Shtof on 26 Feb 2019
This actually works great! Did not know that a function like repelem exists. I used meshgrid to construct pairwise indices, and it resulted in a slower computation.
Thank you!
Adam
Adam on 26 Feb 2019
Yeah, it's one of those useful components to know. It is a relatively recent addition, added in R2015a, although the years seem to be flying past so I guess that is already 4 years ago now!

Sign in to comment.

More Answers (1)

Jos (10584)
Jos (10584) on 26 Feb 2019
% An old-school 20th century indexing trick:
A = randi(9,3,2)
B = 100*randi(9,4,2)
[ia, ib] = ndgrid(1:size(A,1),1:size(B,1))
C = A(ia,:) + B(ib,:)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

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

Start Hunting!