Borrar filtros
Borrar filtros

Remove the loop from a sum of index expression

2 visualizaciones (últimos 30 días)
Tom Holden
Tom Holden el 10 de Nov. de 2022
Comentada: Tom Holden el 10 de Nov. de 2022
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 comentarios
Jiri Hajek
Jiri Hajek el 10 de Nov. de 2022
Hi, your example code produces a vector in each step of the loop, is that a typo? Please clarify, what is the desired result.
Tom Holden
Tom Holden el 10 de Nov. de 2022
No it doesn't. The sum collapses the vector.

Iniciar sesión para comentar.

Respuesta aceptada

Stephen23
Stephen23 el 10 de Nov. de 2022
Editada: Stephen23 el 10 de Nov. de 2022
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 comentario
Tom Holden
Tom Holden el 10 de Nov. de 2022
Somehow I have never encountered "accumarray" before. But it is perfect here.

Iniciar sesión para comentar.

Más respuestas (1)

Torsten
Torsten el 10 de Nov. de 2022
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 comentario
Tom Holden
Tom Holden el 10 de Nov. de 2022
A fair answer! It still feels like there ought to be a solution that is less explicitly a loop than this.

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by