Why doesn't my script work. I try to create a vector in dependecy of variable without a loop. I'm not sure how i have to define the vector before the if cases
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Sebastian
el 16 de Nov. de 2017
Comentada: Jan
el 25 de Nov. de 2017
if true
% code
z=0:1:4000;
g_1=0;
g_2=0;
v(z)=NaN(length(z));
for b=1:length(z)
if z<2000
v(z)=1500+z*g_1;
elseif z>=2000
v(z)=2000+z*g_2;
end
end
end
1 comentario
Respuesta aceptada
Birdman
el 16 de Nov. de 2017
z=0:1:4000;
g_1=0;
g_2=0;
v=NaN(1,length(z));
for b=1:length(z)
if z(b)<2000
v(b)=1500+z(b)*g_1;
elseif z(b)>=2000
v(b)=2000+z(b)*g_2;
end
end
3 comentarios
Stephen23
el 16 de Nov. de 2017
@Sebastian: you would be better off learning how to use MATLAB effectively. See KL's answer for a much neater solution.
Jan
el 25 de Nov. de 2017
I mention this, because it occurs in many code posted in the forum:
After
if z(b)<2000
it is useless to check for:
elseif z(b)>=2000
A simple else is sufficient already: It runs faster and the simpler code reduces the chance for typos.
This is not really important for Sebastian's question, but recommending to omit redundant code will make it easier to debug and maintain the code in general.
Más respuestas (1)
KL
el 16 de Nov. de 2017
No need for a loop, use logical indexing. Here's a better way to write that,
indx = z<2000;
v(indx) = 1500+z(indx)*g_1;
v(~indx)=2000+z(~indx)*g_2;
4 comentarios
Jan
el 25 de Nov. de 2017
+1. Or shorter:
idx = (z >= 2000);
v = 1500 + 500 * idx + z .* (g_1 .* (~idx) + g_2 .* idx);
With reordering the terms this is running 3 times faster:
v = (1500 + z .* g_1) .* ~idx + (2000 + z.* g_2) .* idx;
Ver también
Categorías
Más información sobre Function Creation 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!