Azzera filtri
Azzera filtri

Vectorizing the creation of an offset vector

4 visualizzazioni (ultimi 30 giorni)
Is there any possibility to vectorize this piece of code:
BIN_1 = 7;
C = randi(10,1000,1);
offset_vec = zeros(size(C));
delete = [];
o = 0;
for i = 1:size(C)
if C(i) == BIN_1
o = o + 1;
delete = [delete, i];
end
offset_vec(i) = o;
end
It creates an offset vector, which increases whenever the corresponding element in C equals 7. The for-loop seem very slow.

Risposta accettata

Andrei Bobrov
Andrei Bobrov il 22 Mag 2013
Modificato: Andrei Bobrov il 22 Mag 2013
ii = find(C == BIN_1);
offset_vec = zeros(size(C));
offset_vec(ii) = 1;
offset_vec = cumsum(offset_vec);
or (ADD)
t = C == BIN_1;
offset_vec = cumsum(t);
ii = find(t); % analog of 'delete'
  2 Commenti
Jan
Jan il 22 Mag 2013
Slightly faster: Omit the find() and use logical indexing.
Andrei Bobrov
Andrei Bobrov il 22 Mag 2013
Hi Jan! I agree with you. Added.

Accedi per commentare.

Più risposte (1)

Jan
Jan il 22 Mag 2013
Some comments:
1. Letting a vector grow iteratively is a severe waste of time. Note, that if delete is a 1x1000 vector finally, the iterative construction demands for reverving sum(1:1000) elements any copying almost the same number of elements. Better:
delete = false(1, numel(C));
o = 0;
for i = 1:numel(C)
if C(i) == BIN_1
delete(i) = true;
...
2. size(C) replies a vector. Therefore for i = 1:size(C) might perform unexpected things. Better use (as shown in the code above already) numel(C) or size(C, 1) (or what ever you need exactly).
  1 Commento
Matthias
Matthias il 22 Mag 2013
I know that growing Arrays are pretty slow, but the Finale size of the Array is somewhere around 100, while the for loop has several million iterations. That's why I believe it doesn't really matter in this specific case.

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by