Remove the loop from a sum of index expression
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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
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.
Respuesta aceptada
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
% Simpler code:
V = accumarray(J(:),M(:),[n,1])
Más respuestas (1)
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)
Ver también
Categorías
Más información sobre Loops and Conditional Statements en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!