Filter löschen
Filter löschen

if statement for range of array values

5 Ansichten (letzte 30 Tage)
Trader
Trader am 9 Mai 2012
Is there a better way to write this 'if' statement?
for i = 1:size(somevalue)
if (x(i) < xmax && x(i-1) < xmax && x(i-2) < xmax) || (y(i) < ymax && y(i-1) < ymax)
disp('do something');
end
Thanks for your help!
  1 Kommentar
Oleg Komarov
Oleg Komarov am 9 Mai 2012
Trivial question, do you want the condition to be verified on any (&&) of the 3 consecutive values or on all (&)?

Melden Sie sich an, um zu kommentieren.

Antworten (3)

Wayne King
Wayne King am 9 Mai 2012
How about
if (any(x<xmax) || any(y<ymax))
disp('do something');
end
or do you really want to test if every one is? Of course it seems that x<xmax or y<ymax are to be always true.
  4 Kommentare
Jan
Jan am 9 Mai 2012
@Sean: This needs to create a temporary array of the length numel(x)+numel(y). Therefore I assume this is slower than Wayne's approach.
Richard Brown
Richard Brown am 9 Mai 2012
Hence golf :)

Melden Sie sich an, um zu kommentieren.


Dr. Seis
Dr. Seis am 9 Mai 2012
I think what you might be after is something like:
if all(x(i-1:i+1) < xmax) || all(y(i-1:i+1) < ymax)
% something
end
  2 Kommentare
Dr. Seis
Dr. Seis am 9 Mai 2012
Misinterpreted your "if" statement on my previous attempt. This should be what you are after.
Note: "all" will return TRUE if and only if the entire array returned from "x<xmax" is all 1's. "any" will return TRUE if there is one or more 1 in the array returned by "x<xmax".
Richard Brown
Richard Brown am 9 Mai 2012
If doing it this way, the x indices should be i-2:i, and the y indices should be i-1:i, and the loop should start at 3

Melden Sie sich an, um zu kommentieren.


Richard Brown
Richard Brown am 9 Mai 2012
To check I've understood correctly, you only want to do something if the current and two preceding x values are all less than xmax, or, the current and preceding y values are both less than ymax. Then, the indices you are interested in are given by:
idx = find(filter([1 1 1], 1, x < xmax) == 3 | filter([1 1], 1, y < ymax) == 2)
Note that 1 and 2 will never appear in idx as your expression cannot be evaluated for these

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by