2016-08-21 92 views
1

我想转移到C#,这是一个计算来自MATLAB的表达式的相位角的函数,angle()。我发现angle(x+yi)=atan2(y,x),但这里来了我的问题,我有一个平方根,根据我给它的值是正面负面。但是,在MATLAB中,如果sqrt函数得到否定的结果,它将返回一个假想的,与C#不同,它返回NaNMATLAB角度()到C#转换

那么,我该如何让这两个代码给出相同的结果呢?

即 MATLAB:

angle(a*1i-sqrt(expression)) 

C#:

Mathf.Atan2(a,-sqrt(expression))(我做什么,我认为是错误的)

+0

帮助我与标题某人 – hey

+0

取绝对值的表达式。请记住初中CAST。余弦在第4象限为正,所有功能在第1象限为正,在第2象限为正弦,在第3象限为正切。 – jdweng

+0

@jdweng我认为这不会做,在MATLAB中sqrt(底片)给出了一个假想的数字,用于计算,通过使用abs值我改变结果,使C#将不会像matlab – hey

回答

0

你可以做同样的事情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; 
    } 
} 

如果您不想这样做,您可以看到,sqrt(expression)是(正)虚轴上的数字,如果expression为负,则表示a*i-sqrt(Expression) == (a-sqrt(abs(expression)))*i的相位为π/ 2或3 *π/ 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)); 
    } 
} 
+0

yes,我喜欢谢谢,我看到了复杂的结构,但我认为它会比你的例子中看起来更复杂,那就是我需要再次感谢你的时间 – hey