Remove the loop from a sum of index expression

1 次查看(过去 30 天)
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 个评论
Jiri Hajek
Jiri Hajek 2022-11-10
Hi, your example code produces a vector in each step of the loop, is that a typo? Please clarify, what is the desired result.

请先登录,再进行评论。

采纳的回答

Stephen23
Stephen23 2022-11-10
编辑:Stephen23 2022-11-10
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 个)

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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by