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

5 visualizaciones (últimos 30 días)
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

Respuesta aceptada

Fabio Freschi
Fabio Freschi el 1 de Nov. de 2019
x(x > xMax & 1:length(x) > transition) = xMax

Más respuestas (1)

Guillaume
Guillaume el 1 de Nov. de 2019
Editada: Guillaume el 1 de Nov. de 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.

Categorías

Más información sobre Numeric Types en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by