Possible to modify only one portion of an array in one line?

3 visualizzazioni (ultimi 30 giorni)
I have large arrays (10 to 100k elements) and would like to change some values that are too high, but only after certain point. What I have in mind is something like this:
x = [100 80 70 20 40 10 50 1 60] ;
xMax = 30 ;
transition = 3 ;
x(x>xMax & x(i)>transition) = xMax
I would like to know if there is a more efficient and elegant way of doing it instead of with a loop, like this:
x = [100 80 70 20 40 10 50 1 60] ;
xMax = 30 ;
transition = 3 ;
for i = 1 :length(x)
if i > transition & x(i) > xMax
x(i) = xMax ;
end
end
Is it possible to include two conditions in this manner?
Thanks

Risposta accettata

Fabio Freschi
Fabio Freschi il 1 Nov 2019
x(x > xMax & 1:length(x) > transition) = xMax

Più risposte (1)

Guillaume
Guillaume il 1 Nov 2019
Modificato: Guillaume il 1 Nov 2019
x(transition:end) = min(x(transition:end), xMax)
will be more efficient (than the now accepted answer) since it only test the condition values.
your loop is a bit siily. Since you know where the transition is you could just iterate from there:
for i = transition:numel(x)
if x(i) > xMax
x(i) = xMax
end
end
Why bother iterating over elements yoiu're never going to test.

Categorie

Scopri di più su Numeric Types 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