Remove the loop from a sum of index expression

Consider the following simple example:
% Example setup
n = 5;
m = 10;
M = randn( m, m );
J = randi( n, m, m );
% Code to simplify
V = zeros( n, 1 );
for i = 1 : n
V( i ) = sum( M( J == i ) );
end
Is it possible to replace the loop by a one line expression?
For the sake of answering this, assume that I do not particularly care about either efficiency, or readability. I really just want a one line solution.
The actual code does not have random M and J, so I am also not interested in solutions based on these particular distributions.

2 Comments

Hi, your example code produces a vector in each step of the loop, is that a typo? Please clarify, what is the desired result.
No it doesn't. The sum collapses the vector.

Sign in to comment.

 Accepted Answer

Hiding the loop even more (really everything uses loops, even vectorized code):
% Example setup
n = 5;
m = 10;
M = randn( m, m );
J = randi( n, m, m );
% Code to simplify
V = zeros( n, 1 );
for k = 1:n
V(k) = sum(M(J==k));
end
V
V = 5×1
-8.9895 -0.9206 -1.5965 0.6393 -3.7407
% Simpler code:
V = accumarray(J(:),M(:),[n,1])
V = 5×1
-8.9895 -0.9206 -1.5965 0.6393 -3.7407

1 Comment

Somehow I have never encountered "accumarray" before. But it is perfect here.

Sign in to comment.

More Answers (1)

Here is a loop in disguise:
n = 5;
m = 10;
M = randn( m, m );
J = randi( n, m, m );
V = arrayfun(@(i) sum( M( J == i ) ),1:n)

1 Comment

A fair answer! It still feels like there ought to be a solution that is less explicitly a loop than this.

Sign in to comment.

Products

Release

R2022b

Asked:

on 10 Nov 2022

Commented:

on 10 Nov 2022

Community Treasure Hunt

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

Start Hunting!