Changing the atan function so that it ranges from 0 to 2*pi

321 visualizaciones (últimos 30 días)
I know that the matlab atan function returns values in the range of -pi/2 to pi/2. How do i change it so that it goes over the full range 0 to 2*pi?
My first attempt was using a while loop, but it was incorrect.
I need to write a function mfile to set the built-in matlab function atan in the range of 0 to 2*pi without using atan2. im new to matlab so im unsure of what to do.
Thank you
  2 comentarios
wenjun kou
wenjun kou el 8 de Mzo. de 2017
Editada: wenjun kou el 8 de Mzo. de 2017
Although you don't want to use atan2, I thought I might just put this out there since atan2 returns a range between -pi to pi:
a = atan2(y, x);
a = a .* (a >= 0) + (a + 2 * pi) .* (a < 0);

Iniciar sesión para comentar.

Respuesta aceptada

Daniel Svedbrand
Daniel Svedbrand el 14 de Sept. de 2018
Editada: John D'Errico el 3 de Ag. de 2023
Adding mod 2*pi to atan2 should work just fine
z = mod(atan2(y,x),2*pi);
  6 comentarios
Feruza Amirkulova
Feruza Amirkulova el 3 de Ag. de 2023
Yes, mod(atan2(y,x),2*pi) worked and its gradients are the same as for (atan2(y,x)).
John D'Errico
John D'Errico el 3 de Ag. de 2023
Edited to remove profanity in the answer.

Iniciar sesión para comentar.

Más respuestas (4)

Walter Roberson
Walter Roberson el 12 de Jun. de 2011
Use atan2() instead.
  5 comentarios
Paulo Silva
Paulo Silva el 12 de Jun. de 2011
I didn't include that statement on purpose, when none of the others if statements are true the value of v is NaN, you could also do this:
if isnan(v)
error('Arguments must be different from zero')
end
KA
KA el 12 de Jun. de 2011
ok, did not know that, thanks again

Iniciar sesión para comentar.


Paulo Silva
Paulo Silva el 12 de Jun. de 2011
The Wikipedia got all explained, you just need to do the code, it's very simple.
function v=myatan(y,x)
if nargin==1 %just in case the user only gives the value of y myatan(y)
x=1;
end
v=nan;
if x>0
v=atan(y/x);
end
if y>=0 & x<0
v=pi+atan(y/x);
end
if y<0 & x<0
v=-pi+atan(y/x);
end
if y>0 & x==0
v=pi/2;
end
if y<0 & x==0
v=-pi/2;
end
if v<0
v=v+2*pi;
end
end
  2 comentarios
KA
KA el 12 de Jun. de 2011
thanks, very helpful
Mehmet Can Türk
Mehmet Can Türk el 9 de Abr. de 2022
Editada: Mehmet Can Türk el 9 de Abr. de 2022
I checked the Wikipedia link and tested the code. First of all, thank you so much for the contribution.
I wanted to convert atan2 function from Matlab into another environment which supports only atan function. So I deleted the if block and everything worked perfectly.

Iniciar sesión para comentar.


Kent Leung
Kent Leung el 21 de Mzo. de 2018
Editada: Kent Leung el 21 de Mzo. de 2018
Better late than never. (Also posting as a future reference to myself.) The function below accepts y & x as vectors in Matlab. Rather than using 'if' statements, the below might be faster if there is some parallelization implemented in the built-in index searching.
Note: I have a slight disagreement with the above for the x>0 & y<0 case, as well as the for x=0 & y<0 case. The code below gives 0 to 2pi.
function v=myatan(y,x)
%---returns an angle in radians between 0 and 2*pi for atan
v=zeros(size(x));
v(x>0 & y>=0) = atan( y(x>0 & y>=0) ./ x(x>0 & y>=0) );
v(x>0 & y<0) = 2*pi+atan( y(x>0 & y<0) ./ x(x>0 & y<0) );
v(x<0 & y>=0) = pi+atan( y(x<0 & y>=0) ./ x(x<0 & y>=0) );
v(x<0 & y<0) = pi+atan( y(x<0 & y<0) ./ x(x<0 & y<0) );
v(x==0 & y>=0) = pi/2;
v(x==0 & y<0) = 3/2*pi;
end

theodore panagos
theodore panagos el 27 de Oct. de 2018
You can use the formula:
atan(x,y)=pi-pi/2*(1+sgn(x))*(1-sgn(y^2))-pi/4*(2+sgn(x))*sgn(y) -sgn(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))
x=x2-x1 and y=y2-y1
  1 comentario
theodore panagos
theodore panagos el 6 de Ag. de 2023
atan2(x,y)=pi/2*(1-sign(x))*(1-sgn(y^2))+pi()/4*(2-sgn(x))*sign(y)-sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))

Iniciar sesión para comentar.

Categorías

Más información sobre Get Started with MATLAB en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by