how to calculate the maximum of different parts of a vector without using a for loop?
Mostrar comentarios más antiguos
Hi!
I have a vector H, which is separated in different events of known size, i.e. s=[2,5,7,2,...] and I want to find the maximum that corresponds to each event. How can I do it without using a for loop (I want to reduce the computational time)?
Using a for loop would be:
maxH(1) = max(H(1:s(1)));
for i=2:length(s)
maxH(i) = max(H( 1+sum(s(1:i-1)) : sum(s(1:i-1)) + s(i) ));
end
Thanks!
[EDITED, Jan, code formatted]
1 comentario
Jan
el 30 de Ag. de 2012
Please learn how to format the code.
Respuesta aceptada
Más respuestas (4)
Andrei Bobrov
el 30 de Ag. de 2012
Editada: Andrei Bobrov
el 30 de Ag. de 2012
try this is code
for condition: numel(H) == sum(s)
maxH = cellfun(@max,mat2cell(H(:),s(:),1));
OR
idx = zeros(size(H));
idx(cumsum(s) - s +1) = 1;
maxH = accumarray(cumsum(idx(:)),H(:),[],@max);
1 comentario
Jan
el 30 de Ag. de 2012
The ACCUMARRAY approach is the fastest method under Matlab 2011b. +1
maxH = zeros(1, length(s)); % Pre-allocate!!!
maxH(1) = max(H(1:s(1)));
cs = cumsum(s); % Avoid repeated summation
for ii = 2:length(s)
maxH(ii) = max(H(1 + cs(ii - 1) : cs(ii)));
end
[EDITED] Timings:
s = 1 + randi(10, 1, 10000);
H = rand(1, sum(s));
% Original:
tic;
maxH(1) = max(H(1:s(1)));
for i=2:length(s)
maxH(i) = max(H( 1+sum(s(1:i-1)) : sum(s(1:i-1)) + s(i) ));
end
toc % 0.533000 seconds
% Andrei's CELLFUN:
tic;
maxH = cellfun(@max,mat2cell(H(:),s(:),1));
toc % 0.080097 seconds
% Andrei's ACCUMARRAY:
tic;
idx = zeros(size(H));
idx(cumsum(s) - s +1) = 1;
maxH = accumarray(cumsum(idx(:)),H(:),[],@max);
toc % 0.021015 seconds
% FOR-loop:
tic;
maxH = zeros(1, length(s)); % Pre-allocate!!!
maxH(1) = max(H(1:s(1)));
cs = cumsum(s); % Avoid repeated summation
for ii = 2:length(s)
maxH(ii) = max(H(1 + cs(ii - 1) : cs(ii)));
end
toc % 0.033937 seconds
Robert Cumming
el 30 de Ag. de 2012
In your example above the biggest speed gain would be achieved by pre-allocating the maxH variable
maxH = zeros(length(s),1);
note: For reference - removing the for loop will not necessarily speed things up....
Merce Casas Prat
el 30 de Ag. de 2012
0 votos
Categorías
Más información sobre Descriptive Statistics en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!