MATLAB angle() 到 C# 的转换
MATLAB angle() to C# conversion
我想转移到 C#,一个从 MATLAB 计算表达式相量角的函数,angle()
。我发现 angle(x+yi)=atan2(y,x)
但我的问题来了,我有一个 平方根 取决于我给它的值是 positive或 负面。但是,在 MATLAB 中,如果 sqrt 函数得到一个负数,它 returns 一个 虚数 ,不像 C# returns NaN.
那么,我怎样才能让这两个代码给出相同的结果呢?
即
MATLAB:
angle(a*1i-sqrt(expression))
C#:
Mathf.Atan2(a,-sqrt(expression))
(我做的,我认为是错误的)
您可以做与 Matlab 相同的事情并使用复数数学:
using System.Numerics;
public static class Foo
{
public static double GetAngle(double a, double expression)
{
Complex cA = new Complex(0, a);
Complex sqrt = Complex.Sqrt(expression);
Complex result = cA - sqrt;
return result.Phase;
}
}
如果你不想这样做,你可以看到,如果 expression
是负数,那么 sqrt(expression)
是(正)虚轴上的一个数字,这意味着 a*i-sqrt(Expression) == (a-sqrt(abs(expression)))*i
其相位是 pi/2 或 3*pi/2:
public static class Foo
{
public static double GetAngle(double a, double expression)
{
if (expression < 0.0)
{
double result = a - Math.Sqrt(-expression);
if (result > 0.0)
return Math.PI * 0.5;
else if (result < 0.0)
return Math.PI * 1.5;
else
return 0.0;
}
else
return Math.Atan2(a, -Math.Sqrt(expression));
}
}
我想转移到 C#,一个从 MATLAB 计算表达式相量角的函数,angle()
。我发现 angle(x+yi)=atan2(y,x)
但我的问题来了,我有一个 平方根 取决于我给它的值是 positive或 负面。但是,在 MATLAB 中,如果 sqrt 函数得到一个负数,它 returns 一个 虚数 ,不像 C# returns NaN.
那么,我怎样才能让这两个代码给出相同的结果呢?
即 MATLAB:
angle(a*1i-sqrt(expression))
C#:
Mathf.Atan2(a,-sqrt(expression))
(我做的,我认为是错误的)
您可以做与 Matlab 相同的事情并使用复数数学:
using System.Numerics;
public static class Foo
{
public static double GetAngle(double a, double expression)
{
Complex cA = new Complex(0, a);
Complex sqrt = Complex.Sqrt(expression);
Complex result = cA - sqrt;
return result.Phase;
}
}
如果你不想这样做,你可以看到,如果 expression
是负数,那么 sqrt(expression)
是(正)虚轴上的一个数字,这意味着 a*i-sqrt(Expression) == (a-sqrt(abs(expression)))*i
其相位是 pi/2 或 3*pi/2:
public static class Foo
{
public static double GetAngle(double a, double expression)
{
if (expression < 0.0)
{
double result = a - Math.Sqrt(-expression);
if (result > 0.0)
return Math.PI * 0.5;
else if (result < 0.0)
return Math.PI * 1.5;
else
return 0.0;
}
else
return Math.Atan2(a, -Math.Sqrt(expression));
}
}