Vectorize nested for loops

Hi, I would like to vectorize the following loop, have tried generating indices and but so far been successful.
a = any 1D vector
N = some value
for i=1:length(a)
for j=(i+1):length(a)
if(a(i)-a(j) > N)
disp('Far');
end
end
end
Does anyone have any ideas on this ?

2 Commenti

Guillaume
Guillaume il 31 Gen 2018
The ability of vectorising loops depends solely on the do something. So if you don't tell us what it is, we can't answer your question.
Updated

Accedi per commentare.

Risposte (1)

Guillaume
Guillaume il 31 Gen 2018
Your example is trivially vectorised:
%R2016b or later:
isgreater = (a - a.') > N;
%any version:
isgreater = bsxfun(@minus, a, a.') > N;
isgreater(r, c) is true (1) when a(r)-a(c) > N

3 Commenti

This is not giving the correct answer. For example, if I run the following program :
N=-2;
b=[1 1 1;2 2 2;3 3 3;4 4 4;5 5 5];
a=[1;2;3;4;5];
for i = 1:length(a)
for j = (i+1):length(a)
if(a(i)-a(j) > N)
disp('Far');
end
end
end
This displays Far 4 times which means there ought to be 4 1's in your matrix.
isgreater = (a - a.') > N;
Gives 19 ones.
Guillaume
Guillaume il 1 Feb 2018
Modificato: Guillaume il 1 Feb 2018
Indeed, my answer was equivalent to having the j loop starting at 1 instead of i+1. The upper triangle of that isgreater matrix is the exact equivalent of your loops, so:
isgreater = triu((a - a.') > N, 1)
Thanks this worked !

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by