How can I make it so a while loop doesn't stop if one of the elements in a vector going into it fulfills the condition?

27 vues (au cours des 30 derniers jours)
My code looks something like this:
while(sqrt(x.^2 + y.^2 + z.^2)<1)
some conditions which increases the values of x, y, and z
end
I want to be able to input vectors for x, y, and z, but if I try to the while loop breaks immediately since one set of x, y, and z reaches the condition before the other sets in the vector does. I want to make it so that the while loop continues to work on those elements that have not yet fulfilled the condition while stopping to work on those that already have.
Say for example I set that:
x = [0.5 0.2 1.2];
y = [0.5 0.3 1.0];
z = [0.6 0.1 0.9];
The third set of x, y, and z would then already fulfill the condition and the code stop doing the other conditions for the first two sets of values. Is there any way to make it work?
Thanks so much for any help!

Réponses (1)

Rajanya
Rajanya le 21 Nov 2024 à 12:11
As correctly pointed by you, the loop stops because the condition in the while loop is in vectorized form and whenever any one set of values for ‘x’,’y’ and ‘z’ surpasses the condition, it breaks.
To prevent this, you can take the help of logical indexing to frame the loop condition, ensuring it only includes those indices of the ‘x’,’y’ and ‘z’ vectors for which the ‘sqrt(x.^2 + y.^2 + z.^2)’ is still less than 1. This way, all further computations can be made to only those indices.
Here’s a sample code to demonstrate the following:
res = sqrt(x.^2 + y.^2 + z.^2);
on = find(res<1);
while(sqrt(x(on).^2+y(on).^2+z(on).^2)<1) % check only for the indices under consideration
x(on) = x(on)+0.1;
y(on) = y(on)+0.1; %computations for the indices
z(on) = z(on)+0.1; %under consideration
res = sqrt(x.^2 + y.^2 + z.^2);
on = find(res<1); %see which new indices satisfy the condition
end
Following this, with the provided ‘x’,’y’ and ‘z’ vectors, the loop only terminates when all sets of values for ‘x’,’y’ and ‘z’ fails the loop condition, as confirmed by the variable 'res' after the termination of the loop.
To learn more about vectorization and how to handle it using logical indexing, you can refer the documentation by visiting the documentation page after executing the following command from the MATLAB Command Window:
doc vectorization
Hope this helps!
  2 commentaires
Stephen23
Stephen23 le 21 Nov 2024 à 12:20
"To prevent this, you can take the help of logical indexing to frame the loop condition..."
Good idea, but the code uses FIND() which means that this answer does not actually use logical indexing:
Here is much the same approach, this time actually using logical indexing:
x = [0.5,0.2,1.2];
y = [0.5,0.3,1.0];
z = [0.6,0.1,0.9];
res = sqrt(x.^2 + y.^2 + z.^2);
idx = res<1;
while any(idx)
x(idx) = x(idx)+0.1;
y(idx) = y(idx)+0.1;
z(idx) = z(idx)+0.1;
res = sqrt(x.^2 + y.^2 + z.^2);
idx = res<1;
end
res
res = 1×3
1.1000 1.0488 1.8028
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Rajanya
Rajanya le 22 Nov 2024 à 5:09
@Stephen23 you are correct. Thanks a lot for pointing this out!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by