What is the best way to vectorize this matrix problem?

2 views (last 30 days)
I have a square matrix A which I would like to manipulate using a "map" matrix D. The result will be the matrix B. The entry B(i, j) will be a sum of a number of elements from A(:, j), as determined by D. In the following example, the matrix D tells me that A(1, 1) will be added with A(3, 1) to form B(1, 1), and so on. When the matrices are large, this process takes a long time. Is there a way to vectorize this computation?
A = magic(3); % initial matrix
D = [1, 2, 3; 2, 2, 3; 1, 3, 1]; % map matrix
B = zeros(3); % resultant matrix
for i = 1:3
for j = 1:3
B(D(i, j), j) = B(D(i, j), j) + A(i, j);
end
end

Accepted Answer

John Malik
John Malik on 27 Apr 2017
This question has been answered here.

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 27 Apr 2017
Edited: Andrei Bobrov on 28 Apr 2017
B = accumarray([D(:),repelem((1:size(D,2))',size(D,1))],A(:));

Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!