Filter löschen
Filter löschen

Remove the loop from a sum of index expression

1 Ansicht (letzte 30 Tage)
Tom Holden
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
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.
Tom Holden
Tom Holden am 10 Nov. 2022
No it doesn't. The sum collapses the vector.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Produkte


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by