Remove the loop from a sum of index expression
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Tom Holden
am 10 Nov. 2022
Kommentiert: Tom Holden
am 10 Nov. 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 Kommentare
Jiri Hajek
am 10 Nov. 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.
Akzeptierte Antwort
Stephen23
am 10 Nov. 2022
Bearbeitet: Stephen23
am 10 Nov. 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])
Weitere Antworten (1)
Torsten
am 10 Nov. 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)
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!